为什么子进程在execvp后没有变成僵尸进程?

问题描述 投票:0回答:1

众所周知,如果一个进程用

fork()
创建了一个子进程,然后没有调用wait(),子进程退出后,应该会转变成僵尸进程。但如果在子进程中调用
execvp()
,有时不会转变成僵尸。

如果我这样调用 execvp :

#define ever ;;

int
main(){
    int pid = fork();
    if(pid == 0){
        char** argv = (char**)malloc(sizeof(char*)*1);
        argv[0] = "ls";
        execvp("ls", argv);
        //child
    }
    else{
        for(ever){

        }
    }
}

我发现

ls
程序会直接被回收,而不是变成僵尸。

更令人困惑的是,如果我执行其他程序,例如

python3

#define ever ;;

int
main(){
    int pid = fork();
    if(pid == 0){
        char** argv = (char**)malloc(sizeof(char*)*2);
        argv[0] = "python3";
        argv[1] = "./temp.py";
        execvp("python3", argv);
        //child
    }
    else{
        for(ever){

        }
    }
}

python程序退出后子进程确实变成了僵尸......

posix.1-2008 明确指出:

如果调用进程的父进程没有执行 wait( )、waitid( ) 或 waitpid( ), 并且既没有设置其 SA_NOCLDWAIT 标志,也没有将 SIGCHLD 设置为 SIG_IGN,调用 进程应转变为僵尸进程。僵尸进程是不活动的进程 稍后当其父进程执行wait()、waitid()、 或 waitpid( )。

我不知道为什么会发生这种情况。任何帮助将不胜感激。

c linux process linux-kernel operating-system
1个回答
0
投票

好吧,事实是,

htop
是他妈的错误。只需使用
top
来监控进程,一切都正常。

© www.soinside.com 2019 - 2024. All rights reserved.