众所周知,如果一个进程用
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( )。
我不知道为什么会发生这种情况。任何帮助将不胜感激。
好吧,事实是,
htop
是他妈的错误。只需使用 top
来监控进程,一切都正常。