#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;
}
Output:
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
Now If I will remove sleep(5) in parent then output:
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~
Finally I tried with 0 as third argument to waitpid instead of WNOHANG then its gave me below output with any prints of child:
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
Can somebody help me to understand the behavior of process after executing execl and before executing it?
Remember that output through printf (to stdout) is normally line buffered. That means the output-buffer gets flushed on newline. As you don't have a newline after the string you want to print, the output-buffer will not be flushed.
Either add a newline last in the string, or manually flush the buffers with fflush.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With