我的进程调用赋值中的一个组件似乎运行了一个无限循环,我不知道为什么。这里好像是问题区域
D=fork();
if (D==0)execv("/home/8/myfiles/DD.c",arg);
while(temp != 4){ //return value of D is 4
A = wait(&temp);}
exit(1);
代码的目标是等到D终止。就像评论所说,D以“exit(4)”结尾;所以据我所知,这意味着当它确实将temp分配4,对吧?或者我在这里做错了什么。
答案 0 :(得分:0)
temp
返回wait()
的值不会返回已退出应用程序的退出状态;它返回一个打包值,包含退出代码(如果适用)。
使用the manual page for wait()
中定义的宏(例如WIFEXITED()
和WEXITSTATUS()
)来确定状态代码的含义。请记住,如果您的子进程异常终止(例如,崩溃),wait()
可能会返回一个您希望的值以外的值。
答案 1 :(得分:0)
该行
if (D==0)execv("/home/8/myfiles/DD.c",arg);
似乎应该是:
if (D==0)execv("/home/8/myfiles/DD",arg);
无论如何,处理等待子进程的更强大的方法是:
A = wait(&temp);
if(temp != 4)
{
// Print a message or do whatever makes sense
// to deal with the unexpected value.
}
exit(1);
答案 2 :(得分:0)
你的代码写得很糟糕。您应该测试可能失败的系统调用的返回值(或者,在execv()
的情况下,只是报告它返回然后退出)。您的循环代码应考虑到如果忽略SIGCHLD信号,您可能永远无法从wait()
获得有效状态。而且,正如duskwuff中answer指出的那样,您应该使用正确的宏来测试退出状态。根据经验,您当前的测试将测试孩子是否因为收到信号4(Mac OS X上的SIGILL)而终止。
我认为你应该使用更像代码的代码:
int pid;
if ((pid = fork()) < 0)
{
fprintf(stderr, "fork failed\n");
exit(1);
}
if (pid == 0)
{
const char *cmd = "/home/8/myfiles/DD.c";
execv(cmd, arg);
fprintf(stderr, "failed to execute %s\n", cmd);
exit(1);
}
int corpse;
int status;
while ((corpse = wait(&status)) > 0)
{
if (WIFEXITED(status) && WEXITSTATUS(status) == 4)
break;
printf("PID %d exited with status 0x%.4X\n", corpse, status);
}
exit(0);
您可以检查尸体是否与PID相同 - 这比仅检查退出状态更可靠。您可能决定不想在等待循环中进行打印;虽然你可能会将其保留用于调试目的,但这是合法的。您也可以在进入循环之前打印子项的PID。请注意,即使您知道程序启动的唯一进程是fork()
中的进程,也必须循环。当一个进程执行另一个进程时,如果第一个进程有子进程,则被执行的进程仍然将这些进程作为自己的子进程,并且它们可能在分叉和执行进程之前终止。
有一个名为DD.c
的可执行文件(程序或脚本)是不常见的;名称以.c
结尾的名称通常是C源文件。通常最好使用:
execv(args[0], args);
以便可执行文件的名称是命令的名称。但这不是强制性的。报告命令执行失败时无法执行的命令名称通常是个好主意。