#include
#include
#include
#include
#include
int
main()
{
pid_t pid;
char *message;
int n;
int exit_code;
printf("fork program starting\n");
pid = fork();
switch(pid)
{
case -1:
exit(1);
case 0:
message =
"This is the child";
n =
5;
exit_code
= 37;
break;
default:
message =
"This is the parent";
n =
3;
exit_code
= 0;
break;
}
for(; n > 0; n--) {
puts(message);
sleep(1);
}
if(pid) {
int
stat_val;
pid_t
child_pid;
child_pid
= wait(&stat_val); //系統調用返回子進程PID
//並將狀態信息填入stat_val中
printf("Child has finished: PID = %d\n", child_pid);
if(WIFEXITED(stat_val))
printf("Child exited with
code %d\n", WEXITSTATUS(stat_val));
else
printf("Child terminated
abnormally\n");
}
exit (exit_code);
}
1、這裏要注意的是pid_t定義的pid和進程真正的pid,前者是fork函數返回的值,父進程返回新的pid,而子進程返回0,用getpid()就可以看到他們的真實pid。
2、wait系統調用將暫停父進程直到他的子進程結束爲止,這個調用返回子進程的PID。狀態信息允許父進程瞭解子進程的退出狀態,即子進程的main函數返回的值或子進程中exit函數的退出碼。
3、wait函數的原型pid_t wait(int
*stat_loc);如果stat不是空指針,,就會將子進程的狀態信息寫入其中。