1)wait()函数
在进程中通过fork函数可以创建父子进程,在两个进程中,父子进程可以执行自己的进程,进程的执行也有先后顺序,当调用该函数时可以是进程阻塞成等待状态,直到一个子进程或者该进程收到一个信号为止。如果该进程没有子进程或者子进程已经结束,该函数会立即返回。
下面是wait()函数的一般形式:
/*
* #include
* #include
* #include
* #include
*
* pid_t wait (int *status)
* pid_t wait (pid_t pid ,int *status, int options)
* status是一个整型指针,指向的对象用来保存子进程退出时的状态,
* status是空NULL,表示忽略退出时的状态,
* 子进程的退出状态可以用特定的宏测定
* WIFEXITED(status)
* status = WEXITSTATUS(status)
*
* options一般有三种: WNOHANG 表示不等待,waitpid不阻塞,直接返回值是0;
* 0:此时和wait函数相同
*/
int main ()
{
int status;
pid_t pid ;
printf("parent[pid=%d] is born\n", getpid());
if( pid = fork() < 0){
perror ("fork");
exit (-1);
}
if (pid == 0){
printf("child[pid=%d] is born\n", getpid());
sleep(10);
exit (123);
}else{
pid_t pid_w;
pid_w = wait (&status);//返回状态就是exit()函数的值
if (WIFEXITED(status)){
status = WEXITSTATUS(status);
printf("wait returns with pid = %d. return status is %d\n",
pid_w, status); //wait函数等待的pid_w就是子进程的pid号
}
printf("father is over\n");
return 0;
}
}
//example 2 waitpid:
int main(int argc, char **argv)
{
pid_t pid;
printf("parent[pid=%d] is born\n", getpid());
if (-1 == (pid = fork())) {
perror("fork error");
return 1;
}
if (pid == 0){
printf("child[pid=%d] is born\n", getpid());
sleep(10);
printf("child is over\n");
}
else{ //parent
pid_t pid_w;
while((pid_w = waitpid(pid, NULL, WNOHANG)) == 0) {
printf("child is still living, parent wait w/o HAND and returns with 0\n");
sleep(1);
}
printf("waitpid returns with pid = %d.\n", pid_w);
printf("father is over\n");
}
return 0;
}
/*
waitpid 中的pid_t pid 其值可以有几种
1:pid>0表示只等待进程ID等于你输入的ID值,不管其他子进程有没有结束,父进程会一直等你
给的ID结束才返回等待,
2: pid = -1 表示等待任何子进程结束,才结束等待,
3:pid =0 等待其组ID等于调用的组ID的任一子进程,
*/