了解用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);
}
答案 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)进行多路复用。
答案 1 :(得分:1)
除了管道和分支之外,最简单的方法是使用popen()并将stdout上的childs响应作为FILE流读取。
你根本不需要处理fork。 (尽管确实,popen是在fork和pipe以及dup2之上实现的。)
pclose()可用于检查孩子的退出状态。