为什么如果 execv 失败,进程会创建僵尸,但如果 execv 成功并终止则不会?

帕特里克

所以我对我的 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()和处理孩子的返回值。然后将返回的pidfork()您的父级传递给信号处理程序,并wait在需要时在 sigchld 中的此 pid 上传递(进行一些检查,例如,如果 pid 已经完成,则忽略未来的 SIGCHLD 等...)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章