waitpid错误用法?

时间:2012-11-11 03:31:03

标签: c unix exit-code waitpid

我正在尝试从父级访问分叉子进程的EXIT STATUS,但我得到了奇怪的答案。有时,我得到256或有时我得到一个负数,这取决于我是否指定& status或just status。我知道我非常接近。有人可以给我一些帮助,我将如何获得EXIT_STATUS

这是我的代码

pid_t  pid;
int *status;
if((pid = fork()) < 0)
    fprintf(stdout, "Error forking child process\n");

else if (pid == 0)
{
    execvp(input[0], input);
    fprintf(stdout, "Invalid process!!\n");
    _exit(EXIT_FAILURE);

}
else
{
    while (waitpid(-1, status, 0) != pid);
    fprintf(stdout, "The status is %d\n", &status);
}

2 个答案:

答案 0 :(得分:4)

您正在看到此行为,因为您没有初始化您正在使用的指针,因此您正在调用未定义的行为,这意味着,实际上,任何内容< / em>可能会发生。尝试将status更改为int(而不是int*):

int status;
/* ... */
while (waitpid(-1, &status, 0) != pid);
fprintf(stdout, "The status is %d\n", status);

另一方面,你的代码:

int * status;

这会创建一个指向int的指针,并且不会对其进行初始化。

while (waitpid(-1, status, 0) != pid);

这里你将这个指针传递给waitpid(),它将写入        指向的位置。既然你还没有初始化        指针,它写入未指定的内存        地点!这可能会导致进程崩溃或覆盖        在其他地方分配内存,这可能导致a        后来自发崩溃,或数据损坏!

fprintf(stdout, "The status is %d\n", &status);

这会打印出指针变量的地址 - 不是        它指向的价值!使用*status代替        &status可能允许这部分工作,但你是        仍然使用未初始化的指针。

我强烈建议您将编译器的警告设置调到最大值(使用gcc传递-Wall)以使其对所有内容发出警告。它会捕获未初始化指针的使用,并且它可能还警告您使用带有指针类型值的%d格式说明符。

答案 1 :(得分:0)

不要将大数字或负数用于返回值,它们会使事情变得混乱。 例如,在32位系统上:

for int:255 0x000000ff -1是0xffffffff。因此,如果您返回-1中的任何八个位块,则它们都是0xff或255。

如果你打电话给exit(1)或退出(2)或退出(3),或者其他一些小的正数会对你有好处。在家长中,请务必先致电WIFEXITED(&status)

由于您似乎想要使用退出状态“告诉”您发生的问题,请尝试使用sysexits:http://www.gsp.com/cgi-bin/man.cgi?section=3&topic=sysexits

或者只使用EXIT SUCCESSEXIT_FAILURE ex:return EXIT_SUCCESS;exit(EXIT_FAILURE);保证可以正常工作 - 即,作为回报给您成功或失败。< / p>