我是一个初学者,我还在开始学习C语言中的叉和管道。
我试图创建一个创建一个父进程和一个子进程,重复传递变量给对方。
parent 1发送a,B --〉child 1计算a+b=c --〉parent 1接收c并计算c * 10000=X,然后发送p,q --〉child 1计算p+q=s--〉parent 1接收s,计算s * 10000=Y --〉退出父子进程--〉系统计算X+Y=Z并返回Z
我知道如何不断地分叉并获得相同的父进程但不同的子进程。我基本上多次重复下面的代码来打开新的管道和分叉(pid 1,pid 2,pid 3,pid 4等和port 1,port 2,port 3,port 4等),所以父进程是相同的,但创建了新的子进程。
int port1[2];
if (pipe(port1) == -1){
printf("Error occurred with opening first pipe.");
return 1;
}
int pid1 = fork();
if (pid1 == 0){
close(port1[0]);
c = a+b;
if (write(port1[1], &c, sizeof(c)) == -1){
printf("Error occurred writng to the pipe.");
return 2;
}
close(port1[1]);
exit(EXIT_SUCCESS);
}
else{
close(port1[1]);
read(port1[0], &c, sizeof(c));
X = c * 10000;
close(port1[0]);
}
但我怎么能多次从父母传给同一个孩子呢
3条答案
按热度按时间yws3nbqq1#
我预计将代码分成函数会对你有很大帮助(通常情况下也是如此)。特别是,我建议为通信的父端和子端编写单独的函数。这将使代码更清晰,从而更容易编写和阅读。
这个框架应该是这样的:
您必须决定交换消息的具体形式,但是您有很多选择。如果您不想处理低级别的
read()
和write()
,那么您可以使用fdopen()
来获取管道末端的流接口,您可以使用fprintf()
、fscanf()
、fgets()
* 等 *。这可能会让您更舒服。不过,在这种情况下,请注意,您可能需要在每个消息之后对输出流进行fflush()
。bis0qfac2#
1.函数
call_child(wp,rp,x,y)
:1.将x和y写入管道。
1.从管道读取结果。
1.计算修改后的结果。
1.返回修改结果。
1.创建管道。
1.叉子。
1.如果是孩子,
1.关闭相应的管端。
1.回路,
1.从管道中读取两个值。
1.如果EOF,
1.脱离循环。
1.计算总和。
1.将结果写入管道。
1.出去。
1.关闭相应的管端。
1.使用管道符a和b调用
call_child
。1.打印返回值。
1.使用管道符p和q调用
call_child
。1.打印返回值。
1.关闭其余管端。
1.等待孩子。
tjvv9vkg3#
在程序开始时分叉一次,然后在每个分支内循环。