使用等待和信号使父进程等待孩子结束

时间:2017-10-20 20:52:30

标签: c signals fork wait

我有一个任务,我需要创建一个父进程和2个子进程,具有相同的父,第一个子进程需要读取一个字符串并打印它控制台,第二个子进程需要读取另一个字符串并打印它在控制台中,父亲需要连接这两个字符串并在控制台中打印它。这似乎很简单,但即时通讯有一个艰难的时间等待和信号部分不知何故我不能让父亲先等待孩子的过程,所以他可以采取行动。

#include <stdlib.h>
#include <fcntl.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
char papa[1000]; 
char hijo1[100];
char hijo2[100];


int main () {
pid_t son1,father;
int status;
son1 = fork();

if (son1 == 0) {            //proceso hijo 1
    printf("hijo1:%d\n", getpid());
    fgets(hijo1, 100, stdin);
    printf ("%s\n", hijo1);
sleep(2);
exit (0);
}else if (son1 > 0) {           //proceso padre

    pid_t son2 = fork();

    if (son2 == 0) {        //proceso hijo 2

printf("hijo2:%d\n", getpid());


exit (0);
}else if (son2 > 0) {
    wait(NULL);
    printf("padre:%d\n", getpid());
sleep(2);   
exit (0);
}else {
    printf("fork error");
    return 0;
    }
  } else {
    printf("fork error");
    return 0;
  }

 return 0;
}

这只是结构,而我找到了让父亲等待的方式

1 个答案:

答案 0 :(得分:1)

我会给出一些提示,您可以将它们放在一起。

  • 忘掉信号 - 这太过分了。您根本不需要使用信号来完成此任务。

  • 父子进程不共享地址空间。父进程只能检索子进程的退出状态而不是所需的字符串。那么你如何从孩子那里得到琴弦呢?您需要使用其中一个IPC techniques

  • 对于通信(将字符串从子进程发送到父进程),我建议您查看glibc documentation中的管道示例。该示例仅显示一个子进程。您需要考虑如何为多个流程扩展它。