我正在尝试从父级访问分叉子进程的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);
}
答案 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 SUCCESS
或EXIT_FAILURE
ex:return EXIT_SUCCESS;
或exit(EXIT_FAILURE);
保证可以正常工作 - 即,作为回报给您成功或失败。< / p>