2017-10-20 134 views
1

我有一个任务,我需要创建一个父进程和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

我会给只是使用它,你可以把它放在一起的一些提示的方式。

  • 忘记信号 - 这是一个矫枉过正的问题。完成此任务不需要使用信号。

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

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