首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >waitpid错误用法?

waitpid错误用法?
EN

Stack Overflow用户
提问于 2012-11-11 11:31:03
回答 2查看 3.1K关注 0票数 0

我试图从父进程访问派生的子进程的退出状态,但我得到了奇怪的答案。有时,我会得到256,有时我会得到一个负数,这取决于我是指定了&status还是只指定了status。我知道我已经很接近了。有没有人能给我一点帮助,告诉我如何获得EXIT_STATUS

以下是我的代码

代码语言:javascript
复制
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);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-11 11:32:54

您之所以看到这种行为,是因为您没有初始化您正在使用的指针,因此您调用了未定义的行为,这意味着,从字面上讲,任何事情都可能发生。尝试将status更改为int (而不是int*):

代码语言:javascript
复制
int status;
/* ... */
while (waitpid(-1, &status, 0) != pid);
fprintf(stdout, "The status is %d\n", status);

另一方面,你的代码:

代码语言:javascript
复制
int * status;

这会创建一个指向int的指针,但不会初始化它。

代码语言:javascript
复制
while (waitpid(-1, status, 0) != pid);

这里将这个指针传递给waitpid(),它将在指向的位置写入数据。由于您尚未初始化指针,因此它正在写入未指定的内存位置!这可能会导致进程崩溃或覆盖其他地方分配的内存,这可能会导致稍后的自发崩溃或数据损坏!

代码语言:javascript
复制
fprintf(stdout, "The status is %d\n", &status);

这将打印出指针变量的地址,而不是它所指向的值!使用*status而不是&status可能允许此部分工作,但您仍在使用未初始化的指针。

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

票数 4
EN

Stack Overflow用户

发布于 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 SUCCESSEXIT_FAILURE ex:return EXIT_SUCCESS;exit(EXIT_FAILURE);,它们保证可以工作--也就是说,给你一个成功或失败的回报。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13328332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档