所以我对我的 C 程序的行为感到困惑。我正在使用构造,
int pid = fork();
if (pid == 0) {
if(file_upload_script_path) {
rc = execv(file_upload_script_path, args);
if(rc == -1) {
printf("Error has occured when starting file_upload.exp!\n");
exit(0);
}
} else {
printf("Error with memory allocation!\n");
}
}
else {
printf("pid=%d\n", pid);
}
fork 进程并运行一个脚本来进行文件上传。脚本将通过完成上传或失败自行安全终止。
现在,脚本路径有问题,导致execv
失败。在这里我注意到如果 execv 完成,子进程将成功终止,但如果它失败 (r==-1) 并且我退出进程,它将成为僵尸。有谁知道为什么会这样?
注意这里,我知道为什么子进程会变成僵尸。我感到困惑的是,如果 execv 有效,为什么该进程不会变成僵尸。
编辑:
我有一个关于 errno 和错误原因的问题。错误的原因是已知的。构建过程出现问题,因此脚本的路径与预期不同。
然而,这可能会再次发生,我想确保我的程序在它发生时不会开始产生僵尸。在某些情况下而不是在其他情况下创建僵尸的行为非常令人困惑。
BR帕特里克
如果你不想创建僵尸进程,你的程序就必须收割僵尸进程,不管他们是否execv
调用它,或者execv
调用是否成功。要“自动”获取僵尸进程,请处理 SIGCHLD 信号:
void handle_sigchld(int sig) {
int saved_errno = errno;
while (waitpid((pid_t)(-1), 0, WNOHANG) > 0) {}
errno = saved_errno;
}
int main() {
signal(SIGCHLD, handle_sigchld);
// rest of your program....
}
灵感来自(不......被扯掉)来自:这个链接。
或者你可能只想收获这个指定的孩子,因为稍后你想调用fork()
和处理孩子的返回值。然后将返回的pid
从fork()
您的父级传递给信号处理程序,并wait
在需要时在 sigchld 中的此 pid 上传递(进行一些检查,例如,如果 pid 已经完成,则忽略未来的 SIGCHLD 等...)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句