【问题标题】:get Exit code from child process从子进程获取退出代码
【发布时间】:2021-03-17 07:57:16
【问题描述】:

我在子进程的退出代码中传递了一个参数,因此在父进程中我尝试调用另一个函数,该函数通过使用等待传递子进程传递的退出状态代码,但是我只得到-1作为使用wait调用的退出状态码,有什么办法可以让参数在调用wait方法的退出码中传入。

#include <stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include<sys/wait.h>

pid_t ppid;

void child();
void parent();


int get_child_exit_status()
{
    int status=wait(&ppid);

    return status; //returns -1 instead of 101
      
}
int main(void)
{  
         
   ppid = getpid();
  
    fork();
    child();
    wait(&ppid);
    printf("Child exited with status=%d",get_child_exit_status());
    return 0;

}


void child()
{
        pid_t c_pid = getpid();
        if(c_pid == ppid)
        {
          
                return;
            
        }

        printf("This is a child\n");
        int status;
    
        scanf("%d",&status); //input 101

        exit(status);
}

【问题讨论】:

  • man 3 wait。那里有一个例子......

标签: c multiprocessing


【解决方案1】:

您的代码令人困惑。尽量简化:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main()
{
    int status;
    int code;

    switch (fork()) {
    case 0: // child code
        scanf("%d", &code);
        return code;
    default: // parent code
        wait(&status);
        printf("child exited with status %d\n", WEXITSTATUS(status));
        return 0;
    }
}

我在这里使用了switch,因此您可以轻松地为-1 添加一个案例,以处理分叉时的任何错误。

【讨论】:

  • 得到了答案。添加 WEXITSTATUS(res) 解决了这个问题,现在它正在传递退出状态代码中传递的正确参数。 `
  • 是的,但是您的编码风格让其他程序员难以阅读。我相信这增加了混乱。添加的ppidc_pidstatus 变量以及额外的get_child_exit_statuschild 函数没有帮助。
  • 最终目标是打印子进程而不是父进程,因此使用 cpid 和 ppid。预期的输出应该是//This is a child////Child exited with status=10//所以忽略父进程中的子函数我使用了一个if语句if(getpid()!=ppid){ child();},因此使用c_pid和ppid,谢谢,我会这样关闭它回答因为问题陈述有点令人困惑,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 2013-04-18
  • 2020-06-20
  • 2020-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多