我试图从父进程访问派生的子进程的退出状态,但我得到了奇怪的答案。有时,我会得到256,有时我会得到一个负数,这取决于我是指定了&status还是只指定了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);
}发布于 2012-11-11 11:32:54
您之所以看到这种行为,是因为您没有初始化您正在使用的指针,因此您调用了未定义的行为,这意味着,从字面上讲,任何事情都可能发生。尝试将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(),它将在指向的位置写入数据。由于您尚未初始化指针,因此它正在写入未指定的内存位置!这可能会导致进程崩溃或覆盖其他地方分配的内存,这可能会导致稍后的自发崩溃或数据损坏!
fprintf(stdout, "The status is %d\n", &status);这将打印出指针变量的地址,而不是它所指向的值!使用*status而不是&status可能允许此部分工作,但您仍在使用未初始化的指针。
我强烈建议您将编译器的警告设置调高到最大值(与gcc一起传递-Wall ),以使其对所有内容都发出警告。它将捕获未初始化指针的用法,并且可能还警告您不要将%d格式说明符与指针类型值一起使用。
发布于 2012-11-12 02:12:04
不要使用大数字或负数作为返回值,它们会使事情变得混乱。例如,在32位系统上:
对于int: 255为0x000000ff -1为0xffffffff。因此,如果返回-1中的8位块中的任何一个,它们都是0xff或255。
如果你调用exit(1)或exit(2)或exit(3),或者其他一些小的正数,事情会对你更有利。在父进程中,一定要先调用WIFEXITED(&status)。
由于您似乎希望使用退出状态来“告诉”您所发生的问题,因此可以尝试seem:http://www.gsp.com/cgi-bin/man.cgi?section=3&topic=sysexits
或者简单地使用EXIT SUCCESS或EXIT_FAILURE ex:return EXIT_SUCCESS;或exit(EXIT_FAILURE);,它们保证可以工作--也就是说,给你一个成功或失败的回报。
https://stackoverflow.com/questions/13328332
复制相似问题