在使用fork()创建的C中将子进程的值返回到其父进程

时间:2014-11-08 08:17:17

标签: c concurrency fork

了解用C分叉。

我可以使用fork()生成子进程。假设它执行一些计算。计算完成后,我希望它能够死掉并将结果(一些int)返回给父级。怎么办呢?

通常我会发布我的进度代码,但实际上就是这样:

int main () {
    pid_t  pid = fork();
    if (pid == 0) {
        // I'm a child!
        int calculation = 10 + 10;
        // <----- Return 20 to the parent?
    }else{
        // I am the parent, and I am waiting to receive a 20
    }
    exit(0);
}

2 个答案:

答案 0 :(得分:1)

你不能这样做,因为exit只给出一个退出代码(成功时通常应该EXIT_SUCCESS,并且只有7位)。退出代码是流程返回的唯一内容(请参阅waitpid(2),您应始终致电以避免zombie processes)。

您可以让父级和子级进程使用一些共享内存和信号量(请参阅shm_overview(7)&amp; sem_overview(7)),但这很复杂,因此不适合您的情况。

最简单 - 也许可能最快的方法就是使用pipe(7) - s(在 fork之前设置)并在其上打印子进程< em> stdout 到管道,父进程在管道上读取。请参阅pipe(2)popen(3)

您可能希望并行处理fork 几个(桌面上最多十几个)进程。然后你需要多路复用他们的管道输入。为此,有一些事件循环并在父进程中使用poll(2)进行多路复用。

另请阅读Advanced Linux Programming

答案 1 :(得分:1)

除了管道和分支之外,最简单的方法是使用popen()并将stdout上的childs响应作为FILE流读取。

你根本不需要处理fork。 (尽管确实,popen是在fork和pipe以及dup2之上实现的。)

pclose()可用于检查孩子的退出状态。