程序中的无限循环

时间:2015-02-05 04:58:53

标签: c process infinite-loop exit

我的进程调用赋值中的一个组件似乎运行了一个无限循环,我不知道为什么。这里好像是问题区域

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,对吧?或者我在这里做错了什么。

3 个答案:

答案 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()获得有效状态。而且,正如duskwuffanswer指出的那样,您应该使用正确的宏来测试退出状态。根据经验,您当前的测试将测试孩子是否因为收到信号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);

以便可执行文件的名称是命令的名称。但这不是强制性的。报告命令执行失败时无法执行的命令名称通常是个好主意。