C 关于wait()和waitpid()
所以我在C上写了这段代码。我创建了一个父亲,它有两个子进程,其中一个变成了僵尸。过了一秒钟,它退出了,等待它的父亲完成了。另一个子进程保持孤立状态,然后完成。我的问题是,如果我为C 关于wait()和waitpid(),c,wait,waitpid,C,Wait,Waitpid,所以我在C上写了这段代码。我创建了一个父亲,它有两个子进程,其中一个变成了僵尸。过了一秒钟,它退出了,等待它的父亲完成了。另一个子进程保持孤立状态,然后完成。我的问题是,如果我为waitpid更改wait,会发生什么 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> int ma
waitpid
更改wait
,会发生什么
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main() {
pid_t pid;
int status, value;
pid = fork();
if (pid > 0) { // Father
pid = fork();
if (pid > 0) { // Father
wait(&status);
value = WEXITSTATUS(status);
if (value == 2)
printf("Child 2");
else if (value == 3)
printf("Child 1");
} else if (pid == 0) { //Child 2 - Orphan
sleep(4);
exit(2);
} else {
exit(1);
}
} else if (pid == 0) { // Child 1 - Zombie
sleep(1);
exit(3);
} else {
printf("Error al ejecutar el fork");
exit(1);
}
return 0;
}
#包括
#包括
#包括
#包括
#包括
int main(){
pid_t pid;
国际地位、价值;
pid=fork();
如果(pid>0){//
pid=fork();
如果(pid>0){//
等待(&状态);
值=WEXITSTATUS(状态);
如果(值==2)
printf(“儿童2”);
else if(值==3)
printf(“儿童1”);
}如果(pid==0){//Child 2-孤立,则为else
睡眠(4);
出口(2);
}否则{
出口(1);
}
}如果(pid==0){//Child 1-僵尸,则为else
睡眠(1);
出口(3);
}否则{
printf(“错误al-ejecutar el-fork”);
出口(1);
}
返回0;
}
引用
提供waitpid()函数有三个原因:
- 支持作业控制
- 允许wait()函数的非阻塞版本
- 允许库例程(如system()或pclose())等待其子级,而不干扰进程尚未等待的其他终止子级
因此waitpid()的行为取决于它的参数。第一个孩子将变成僵尸,直到父亲退出,然后它将变成孤儿。@Barmar但这怎么可能呢?第一个子进程(成为僵尸)也会退出。如果一个进程的父进程不等待就退出,则该进程将成为孤儿。即使孩子已经离开了,这也是事实。当它成为孤立进程时,
init
接受它,等待它,然后进程就消失了。@Barmar那么,两个子进程都变成孤立进程了吗?不。你用waitpid()
等待的进程不会变成孤立进程,因为你在等待它。我猜他的意思是waitpid(pid,&status)
@Ayak973 wait()的非阻塞版本是什么function@Mr.Kevin如果你用WNOHANG
选项调用waitpid
,它不会阻塞。@Barmar:如果他按照你的建议编写代码,代码就不会编译(waitpid()
包含三个参数)。是的,我在缩写以表明我的观点,他在等一个特定的pid