【发布时间】:2020-10-28 18:55:20
【问题描述】:
我现在正在学习folk,exec等,我有这段代码:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
pid_t childpid;
int status;
childpid=fork();
if (childpid== -1){
perror("Failed to fork\n");
exit(1);
}
if (childpid==0) {
printf("I am in child process with id = %lu\n", (long)getpid());
execvp(argv[1], &argv[1]);
perror("exec failure ");
exit(1);
}
else {
printf("I am in parent process with id = %lu\n", (long)getpid());
exit(1);
}
}
子进程工作正常,但之后由于某种原因程序继续运行而没有做任何事情。它从不打印“我在 id = .... 的子进程中”或“我在 id =... 的父进程中”。就像它永远不会进入父进程一样。你有什么想法为什么?提前致谢
【问题讨论】:
-
你正在创建一个僵尸进程。这是因为父进程没有等待子进程完成。父进程将[相对]快速终止。因此,孩子失去了父母,变成了一个僵尸。僵尸将被内核重新设置为进程 1 的子进程(例如
systemd或initd)。要修复,请在最后的printf之后添加:wait(NULL);。 -
非常感谢!因此,我是否需要在这些类型的情况下始终放置 wait(NULL) ?
-
您能否修正问题中的拼写,以便对其他人有用?