2014-04-04 505 views
1
#include <errno.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <sys/wait.h> 
#include <unistd.h> 

int main(void) 
{ 
    pid_t Checksum_pid = fork(); 

    if (Checksum_pid < 0) 
     printf("Fork Failed\n"); 
    else if (Checksum_pid == 0) 
    { 
    printf("\nInside Child Process before execl");   
    //execl("/bin/sleep", "/bin/sleep", "2", NULL); 
    execl("/bin/ls","ls",(char *)NULL) ; 
     //exit(EXIT_FAILURE); 
    printf("\nInside Child Process after execl\n"); 
    exit(EXIT_FAILURE); 
    } 
    else 
    { 
     int childStatus;   
    printf("\nInside Parent Process"); 
    sleep(5); 
    pid_t returnValue = waitpid(Checksum_pid, &childStatus, WNOHANG); 

     if (returnValue > 0) 
     { 
      if (WIFEXITED(childStatus)) 
       printf("\nChild Exit Code: %d\n", WEXITSTATUS(childStatus)); 
      else 
       printf("\nChild Exit Status: 0x%.4X\n", childStatus); 
     } 
     else if (returnValue == 0) 
      printf("\nChild process still running\n"); 
     else 
     { 
      if (errno == ECHILD) 
       printf("\nError ECHILD!!\n"); 
      else if (errno == EINTR) 
       printf("\nError EINTR!!\n"); 
      else 
       printf("\nError EINVAL!!\n"); 
     } 
    printf("\nParent: I am about to finish\n"); 
    } 

    return 0; 
} 

輸出:打印不輸出可見

kth4kor-2:~/bosch/Test1$ ./a.out a.out ___waitpid_test1 waitpid_test1~ waitpid_test1.c waitpid_test1.c~ waitpid_test2.c waitpid_test2.c~ 
Inside Parent Process Child Exit Code: 0 
Parent: I am about to finish 

,如果我現在將(5)在母體除去睡眠然後輸出:

kth4kor-2:~/bosch/Test1$ ./a.out 
Inside Parent Process 

Child process still running 

Parent: I am about to finish 

[email protected]:~/bosch/Test1$ a.out ___waitpid_test1 waitpid_test1~ waitpid_test1.c waitpid_test1.c~ waitpid_test2.c waitpid_test2.c~ 

最後餘以0嘗試作爲第三個參數waitpid而不是WNOHANG然後它給了我下面的輸出與任何打印的孩子:

kth4kor-2:~/bosch/Test1$ ./a.out 
a.out ___waitpid_test1 waitpid_test1~ waitpid_test1.c waitpid_test1.c~ waitpid_test2.c waitpid_test2.c~ 
Inside Parent Process 
Child Exit Code: 0 
Parent: I am about to finish 

有人可以幫助我理解執行execl之後和執行之前的過程行爲嗎?

+2

除了@Joachim提到的解決方案,您可以使用'setbuf(stdout,NULL)'設置禁用緩衝;'或者在'stderr'上打印您的消息。 –

+0

printf(「\ n在execl之前的子進程\ n」);工作正常... – kapilddit

回答

6

請記住,通過printf(至stdout)的輸出通常是行緩衝。這意味着輸出緩衝區會在換行符上被刷新。由於在要打印的字符串後面沒有換行符,輸出緩衝區將不會被刷新。

要麼在字符串中最後添加一個換行符,要麼用fflush手動刷新緩衝區。

+0

謝謝,它現在工作。意味着execl可見之前的printf! execl會怎樣處理子進程?我讀過execl會創建過程的圖像。如果成功,execl的返回碼是什麼? – kapilddit

+1

@kapilddit如果'execl'(和家庭)成功,它將*不*返回。它只會在失敗時返回。所做的是將當前進程的圖像(大致程序)替換爲調用加載的圖像。 –

+0

如果我不使用睡眠,孩子的過程會怎樣(5);在父母的過程中。那麼子進程就變成孤兒了?當我得到味精「兒童進程仍在運行」。如果我不想在waitpid中使用WNOHANG的父親程序中使用睡眠(5),該如何解決? – kapilddit