#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
现在,如果我将删除parent中的sleep(5),则输出:
kth4kor-2:~/bosch/Test1$ ./a.out Inside Parent Process Child process still running Parent: I am about to finish kth4kor@g3gdev-kth4kor-2:~/bosch/Test1$ a.out ___waitpid_test1 waitpid_test1~ waitpid_test1.c waitpid_test1.c~ waitpid_test2.c waitpid_test2.c~
最后,我尝试使用0作为waitpid而不是WNOHANG的第三个参数,然后在下面的输出中显示了所有child的打印内容:
有人可以帮助我理解执行execl之后和执行之前的行为吗?
请记住,通过printf(至stdout)的输出通常是 行缓冲的 。这意味着输出缓冲区将在换行符上刷新。由于您要打印的字符串后没有换行符,因此不会清除输出缓冲区。
printf
stdout
在字符串的最后添加换行符,或使用手动刷新缓冲区fflush。
fflush