您的位置:首页 > 大数据 > 人工智能

进程等待wait,waitpid

2016-11-24 23:37 447 查看

wait函数

wait函数用于等待子进程中断或者结束。

wait()函数会暂时停止目前进程的执行,直到有信号来到或者子进程结束为止。如果在调用wait()时子进程已经结束,则wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数status返回,而子进程的进程识别码也会一起返回。如果不在意结束状态值,则参数status可以设成NULL。子进程的结束状态值请参考waitpid()。

waitpid函数

可以看个实际的例子。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>

void die(const char *msg)
{
perror(msg);
exit(1);
}

void child2_do()
{
printf("In child2: execute 'date'\n");

sleep(5);
if (execlp("date", "date", NULL) < 0) {
perror("child2 execlp");
}
}

void child1_do(pid_t child2, char *argv)
{
pid_t pw;

do {
if (*argv == '1') {
pw = waitpid(child2, NULL, 0);
}
else {
pw = waitpid(child2, NULL, WNOHANG);
}
if (pw == 0) {
printf("In child1 process:\nThe child2 process has not exited!\n");
sleep(1);
}
}while (pw == 0);

if (pw == child2) {
printf("Get child2 %d.\n", pw);
sleep(5);
if (execlp("pwd", "pwd", NULL) < 0) {
perror("child1 execlp");
}
}
else {
printf("error occured!\n");
}
}

void father_do(pid_t child1, char *argv)
{
pid_t pw;

do {
if (*argv == '1') {
pw = waitpid(child1, NULL, 0);
}
else {
pw = waitpid(child1, NULL, WNOHANG);
}

if (pw == 0) {
printf("In father process:\nThe child1 process has not exited.\n");
sleep(1);
}
}while (pw == 0);

if (pw == child1) {
printf("Get child1 %d.\n", pw);
if (execlp("ls", "ls", "-l", NULL) < 0) {
perror("father execlp");
}
}
else {
printf("error occured!\n");
}
}

int main(int argc, char *argv[])
{
pid_t child1, child2;

if (argc < 3) {
printf("Usage: waitpid [0 1] [0 1]\n");
exit(1);
}

child1 = fork();

if (child1 < 0) {
die("child1 fork");
}
else if (child1 == 0) {
child2 = fork();

if (child2 < 0) {
die("child2 fork");
}
else if (child2 == 0) {
child2_do();
}
else {
child1_do(child2, argv[1]);
}
}
else {
father_do(child1, argv[2]);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  进程等待