我目前正在尝试在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;
Run Code Online (Sandbox Code Playgroud)
}
stdio文件在程序退出时刷新,但execvp直接用另一个映像替换该进程,绕过flush-at-exit机制并将I am child消息留在内存中,永远不会发送到屏幕.fflush(stdout)在execvp字符串之前添加显式或结束字符串,\n以便在TTY上运行时自动刷新它.
请注意,execvp永远不会退出,如果是,则是因为它无法执行新进程.此时,孩子唯一可以做的就是报告错误并调用_exit(127)(或类似的退出状态).如果子进程继续,则配置错误的命令名将导致它与父进程并行执行父进程的其余部分.这个过程将继续为其他后代,有效地创建一个可以使您的系统停止运转的叉炸弹.