0

我很困惑。据说,基于 man 和许多其他来源,例如: 当操作系统杀死您的进程时返回代码 wait(&status) 应该使我有可能获得子进程的退出状态或返回值?

这两个代码片段应该让我看到它的孩子的退出值,然后打印它。子进程函数:

    int childFunction(char in[],char logPath[]){
        FILE *logFile= fopen( logPath, "a" );
        if(logFile==NULL)
        return 1;
        int c=system(in);
        fclose(logFile);
        return(c);
    }

主要:

        {...some unimportant code before this}
        result= fork();
        if(result==0){
            exit(childFunction(inLine,logPath));
        }
        else if(result>0){
            int status=0;;
            int c=(int)waitpid(-1,&status,0);
            printf("a:%d b:%d\n",status, WIFEXITED(status));
        else
            return -1;
        i=0;

我尝试了等待,睡了一段时间,退出,返回,并阅读了几次手册页。要么我对这个功能的理解存在基本错误,要么看了 4 小时后我根本看不到它。

已解决由于某种原因,我绝对不明白,如果您将return(c)in childFunction 更改为if(c!=)return(1);else return(0)它将起作用。不知道为什么。

已解决 2 好的,现在我想我知道为什么了。看,似乎返回调用或等待将状态减少到 8 个最高有效位 (256)。这意味着什么?这意味着,如果您发送普通 int,则使用第一位,而丢弃后 8 位。同时,当我指定return (1)编译器自动将int“缩短”为short int。解决方案是返回一个短数字,或者像我在之前的“已解决”评论中所做的那样。

4

1 回答 1

5

问题是您不是在等待孩子退出

int c=(int)waitpid(-1,&status,WNOHANG);

在这里,父进程检查子进程是否已退出,如果子进程尚未退出,则返回。

在上述情况下,由于您在子进程中打开文件,因此子进程中存在 IO 等待的可能性更大,因此父进程将被执行。

现在父进程将检查状态,因为WNOHANG使用它不会在 waitpid 处被阻塞,它会继续,这就是你没有得到正确状态的原因

我建议你使用

int c=(int)waitpid(&status);
于 2013-03-26T17:30:48.733 回答