Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 关于wait()和waitpid()_C_Wait_Waitpid - Fatal编程技术网

C 关于wait()和waitpid()

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

所以我在C上写了这段代码。我创建了一个父亲,它有两个子进程,其中一个变成了僵尸。过了一秒钟,它退出了,等待它的父亲完成了。另一个子进程保持孤立状态,然后完成。我的问题是,如果我为
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())等待其子级,而不干扰进程尚未等待的其他终止子级

如果pid参数为(pid_t)-1,选项参数为0,则waitpid()函数应等效于wait()。否则,其行为应通过pid和options参数的值进行修改


因此waitpid()的行为取决于它的参数。

第一个孩子将变成僵尸,直到父亲退出,然后它将变成孤儿。@Barmar但这怎么可能呢?第一个子进程(成为僵尸)也会退出。如果一个进程的父进程不等待就退出,则该进程将成为孤儿。即使孩子已经离开了,这也是事实。当它成为孤立进程时,
init
接受它,等待它,然后进程就消失了。@Barmar那么,两个子进程都变成孤立进程了吗?不。你用
waitpid()
等待的进程不会变成孤立进程,因为你在等待它。我猜他的意思是
waitpid(pid,&status)
@Ayak973 wait()的非阻塞版本是什么function@Mr.Kevin如果你用
WNOHANG
选项调用
waitpid
,它不会阻塞。@Barmar:如果他按照你的建议编写代码,代码就不会编译(
waitpid()
包含三个参数)。是的,我在缩写以表明我的观点,他在等一个特定的pid