C语言中的进程管理:向父进程发送数据

4

我正在为操作系统课程编写一个程序,需要一种好的方法将整数从子进程传递给其父进程,最好不使用管道。

经过一些尝试和错误,我找到了以下代码来完成这个任务:

pid_t pid_son;
int status;

if( (pid_son = fork()) >= 0) {
    if(pid_son == 0) {
        int result = 0;
        // Make some arithmetic
         exit(result);   
    }
    else {
        while(pid_son != wait(&status));
        printf("The result is %d\n",result);
    }
}

但是在我的看法中这不是“正确”的(退出应该返回进程的退出状态以进行错误处理,而不是随机整数)。是否有更清晰的方法将结果“发送”给父进程而不使用这个技巧呢?


2
为什么不能使用管道?另请参阅Linux特定的eventfd(2) - Basile Starynkevitch
3
你可以发送一封电子邮件吗? - Kerrek SB
这个“技巧”在大多数系统上只能让你通讯256个不同的值。 - Kerrek SB
1
最好不要使用管道。有很多方法可以实现它,但使用管道可能是最简单和干净的方法。 - n. m.
@KerrekSB 我刚刚测试了“exit”技巧,发现通过这种方式获得的结果确实被限制在256以内。有趣的是,当我获取“status”时,“exit”返回的结果会乘以256。 - pauix
显示剩余3条评论
3个回答

1

最干净的方法是读取子进程的标准输出。

在C语言中,这涉及使用管道 :)

这并不像你想象的那么可怕。看一下使用popen的标准示例。

编辑:如果它是您自己进程的分支,而不是fork-exec,则答案仍然是管道。


popen 有一个缺点,它将管道绑定到子进程的标准输出,因此不能将 stdout 用于其他任何事情。 - user2719058

1
如果您真的想避免使用管道,并且愿意使用更为晦涩的机制,我建议您研究一下 sigqueue(3),它可以用于向另一个进程发送一个整数。

谢谢你的回答,但我想我会继续使用管道。我可能以后还要处理它们,所以最好现在就熟悉一下。 - pauix

1

这里也可以使用共享内存。

查阅 shmgetshmat 函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接