问题:在创建进程那一节,我们看到,消息的输出是父子进程交替输出,且父进程在子进程之前结束。如果要安排父进程在子进程结束之后,可以调用wait函数。
函数说明:
pid_wait (int stat_loc)
包含的头文件:#include<sys/types.h> #include<sys/wait.h>
返回值:子进程的pid 参数:如果stat_loc 不是一个空指针,状态信息将被写入他指向的位置
sys/wait.h文件中的状态信息如下表:
宏定义 说明
WIFEXITED(stat_val) 如果进程正常结束,他就取一个非零值
WEXITSTATUS(stat_val) 如果wifexited非零,它返回子进程的推出码
WIFSIGNALED(stat_val) 如果子进程因为一个未捕获的信号而终止,他就去一个非零值
WTERMSIG(stat_val) 如果wifsignaled非零,它返回一个信号代码
WIFSTOPPED(stat_val) 如果子进程终止,他就取一个非零值
WSTOPSIG(stat_val) 如果WIFSTOPPED 非零,它返回一个信号代码
wait系统调用会使父进程暂停执行,直到它的一个子进程结束为止。
-
#include <sys/types.h>
-
#include <sys/wait.h>
-
#include <unistd.h>
-
#include <stdio.h>
-
-
int main(){
-
pid_t pid;
-
char * message;
-
int n;
-
int exit_code;
-
-
printf("fork program starting ");
-
pid = fork();
-
switch(pid){
-
case -1:
-
perror("fork failed");
-
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;
-
}
-
-
/*pid非0,在父进程执行*/
-
if(pid){
-
int stat_val;
-
pid_t child_pid;
-
-
/*父进程直到子进程推出后执行*/
-
child_pid = wait(&stat_val);
-
printf("Child process has finished: PID=%d ",child_pid);
-
if(WIFEXITED(stat_val))
-
/*子进程正常结束,输出子进程退出码,即exit_code=37*/
-
printf("Child exited with code %d ", WEXITSTATUS(stat_val));
-
else
-
/*子进程非正常结束*/
-
printf("Child terminated abnormally ");
-
}
-
-
for(; n > 0; n--){
-
puts(message);
-
sleep(1);
-
}
-
exit(exit_code);
-
-
-
}
父进程通过wait系统调用把自己的执行挂起,直到子进程的状态信息出现为止。这将发生在子进程调用exit()的时候,我们把它的退出码设为37.
然后,父进程继续执行,通过测试wait调用的返回值确定子进程已经正常结束,并从状态信息里提取出自进程的退出码。