子进程 c 的返回值

Posted

技术标签:

【中文标题】子进程 c 的返回值【英文标题】:return value from child process c 【发布时间】:2017-04-22 03:41:21 【问题描述】:

我需要帮助将我的子程序中的“状态代码”返回给父程序,在那里它将检查状态代码、打印代码并退出父程序。这是一个类项目,所以我会在这里放一些相关的代码,但出于明显的原因我不会发布整个项目。

我已经通过 exec 分叉并创建了子进程。父进程做了一些花哨的数学运算,并使用命名管道将数据推送到子进程。孩子做一些更花哨的数学。当我使用关键字时,孩子需要将它完成花哨数学的次数返回给父母,父母会看到这个,打印出返回的数字,然后退出父母。

    int status;
    pid_t child_id;
    child_id = fork();
    if (child_id == 0)
    
            // put child code here
            exec(opens second process);
    
     if (child_id < 0)
    
            perror("fork failed\n");
            exit(EXIT_FAILURE);
    

     while(child_id != 0)
     
       //parent process
       //do fancy math stuff here
       // pipe
      //open pipe
      //converted math to "string" to pass to other program
      // use fprintf to send data to other program
      fprintf(fp,"%s",str);
      //close pipe
//**************************************************
//this block doesn't work, always returns 0
      if (WIFEXITED(status))
            int returned = WEXITSTATUS(status);
            printf("exited normally with status %d\n",returned);
      
//***************************************************
   return 0;

第二个 c 程序只是简单地读取管道,做一些更花哨的数学运算,并在我想要返回数字的地方放置了 return 语句。

据我了解,有一种方法可以从子程序传递返回值,但我似乎无法理解如何。我已经添加了一段我找到的代码,但我似乎无法让它工作。我读过它,但也许我遗漏了什么?

请忽略任何语法或结构问题。

【问题讨论】:

在调用exec() 之后插入以下两行:perror( "exec failed" )l exit( EXIT_FAILURE ); 表示调用exec() 失败时的“罕见”情况 【参考方案1】:

您试图通过WIFEXITED 函数读取status,但您从未给它一个值。尝试读取未初始化的值会调用 undefined behavior。

您需要调用wait 函数,该函数告诉父级等待子级完成并接收其返回码:

wait(&status);
if (WIFEXITED(status))
      int returned = WEXITSTATUS(status);
      printf("exited normally with status %d\n",returned);

【讨论】:

@user7904063 很高兴我能帮上忙。如果您觉得有用,请随时 accept this answer。

以上是关于子进程 c 的返回值的主要内容,如果未能解决你的问题,请参考以下文章

fork和exec函数

linux c学习笔记----进程创建(fork,wait,waitpid)

C库函数和系统调用的区别

linux 进程 --- 进程的创建及相关api

进程间通信的方式(转)

Linux学习之“fork函数”