【发布时间】:2019-11-27 13:09:24
【问题描述】:
所以我对我的 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 帕特里克
【问题讨论】:
-
而errno的值是多少?
-
@KamilCuk 错误?你的意思是execv的错误代码吗?这不会是rc吗?或者更好的问题,使用 errno.h,这将如何实际解决问题?
-
在子进程中
exec()失败后调用exit()是不安全的。exit()所做的一件事是刷新所有缓冲的流,并且由于子进程是父进程的副本,并且包含在调用fork()时父进程缓冲的任何数据的副本,因此 child 进程随后会将这些数据刷新到 父级的 文件中。您需要调用 POSIX_exit()或标准 C_Exit()函数。 -
From man execv:
The return value is -1, and errno is set to indicate the error.errno 设置为指示错误。哦,我看到了编辑。但是无论是否调用 execv 都必须收割孩子,而不是创建僵尸。
标签: c fork child-process