我目前正在尝试在C中运行fork函数,在代码的子部分, 我试图使用exacvp执行命令,但在执行之前我正在尝试一个永远不会执行的printf函数。我在调试中运行了这个,我注意到pid永远不会被分配0.我在一个单独的项目上尝试了一个简单的fork示例,它运行顺利。有没有人知道为什么子部分永远不会执行?
int startProcesses(int background) {
int i = 0;
while(*(lineArray+i) != NULL) {
int pid;
int status;
char *processName;
pid = fork();
if (pid == 0) {
printf("I am child");
// Child Process
processName = strtok(lineArray[i], " ");
execvp(processName, lineArray[i]);
i++;
continue;
} else if (!background) {
// Parent Process
waitpid(pid, &status, 0);
i++;
if(WEXITSTATUS(status)) {
printf(CANNOT_RUN_ERROR);
return 1;
}
} else {
i++;
continue;
}
}
return 0;
}
答案 0 :(得分:6)
stdio文件在程序退出时刷新,但execvp
直接用另一个映像替换该进程,绕过flush-at-exit机制并将I am child
消息留在内存中永远不会发送到屏幕。在fflush(stdout)
之前添加明确的execvp
,或者使用\n
结束字符串,以便在TTY上运行时自动刷新。
请注意,execvp
永远不会退出,如果是,则是因为它无法执行新进程。此时,孩子可以做的唯一事情是报告错误并调用_exit(127)
(或类似的退出状态)。如果子进程继续,则配置错误的命令名将导致它与父进程并行执行父进程的其余部分。这个过程将继续为其他后代,有效地创建一个可以使你的系统停止运转的叉炸弹。