【发布时间】:2017-03-30 14:51:50
【问题描述】:
我的任务是
一个。一个父母和两个孩子
b.父级从用户那里获取数据
c。发送给孩子进行加减运算。
d。再次从用户那里获取输入并发送给另一个孩子进行乘法和除法。
e。第一个子进程创建另一个子 C3。
f。两个子进程都将结果发送到子进程 C3 以显示输出。
g.父进程在每个子进程任务完成后杀死该进程。
我写了下面的代码,但我不知道我做错了什么,我尝试调试它,但我不知道它有什么问题,它没有显示乘法和除法的结果。
这是我的代码:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include<string.h>
#include <stdlib.h>
int main()
{
int status = 0;
int pfds[2];
int pfds2[2];
int pfds3[2];
int pfds4[2];
int val = 0;
int val2 = 0;
pipe(pfds);
pipe(pfds2);
pipe(pfds3);
pipe(pfds4);
printf("Enter FIRST Number: ");
scanf("%i", &val);
printf("Enter SECOND Number: ");
scanf("%i", &val2);
if (fork() == 0)
{
//Child
printf("I'm Child 1 and I'm Calculating Sum AND Differnece Of Numbers\n");
read(pfds[0], &val, sizeof(val));
read(pfds2[0], &val2, sizeof(val));
int sum = val + val2;
int sub = val - val2;
write(pfds3[1], &sum, sizeof(val));
write(pfds4[1], &sub, sizeof(val));
if (fork() == 0)
{
read(pfds3[0], &val, sizeof(val));
printf("Sum Of Numbers Is : %i\n", val);
read(pfds4[0], &val, sizeof(val));
printf("Sub Of Numbers Is : %i\n", val);
read(pfds[0], &val, sizeof(val));
printf("Mul Of Numbers Is : %i\n", val);
read(pfds2[0], &val, sizeof(val));
printf("Div Of Numbers Is : %i\n", val);
exit(1);
}
else
{
wait(&status);
}
exit(1);
}
else
{
if (fork() == 0)
{
//Child2
printf("I'm Child 2 and I'm Calculating Multiplication and Division Of Number\n");
read(pfds[0], &val, sizeof(val));
read(pfds2[0], &val2, sizeof(val));
int mul = val * val2;
int div = val / val2;
write(pfds[1], &mul, sizeof(val));
write(pfds2[1], &div, sizeof(val));
exit(0);
}
else
{
//wait(&status);
write(pfds[1], &val, sizeof(val));
write(pfds2[1], &val2, sizeof(val));
wait(&status);
} //else1
} //else2
} //main
它给了我以下输出:
Enter FIRST Number: 4
Enter SECOND Number: 2
I'm Child 1 and I'm Calculating Sum AND Differnece Of Numbers
I'm Child 2 and I'm Calculating Multiplication and Division Of Number
Sum Of Numbers Is : 6
Sub Of Numbers Is : 2
如果有人能帮上忙,非常感谢。
【问题讨论】:
-
这里有三个
fork()调用。你还是说:“一个父母和两个孩子”? -
第一个子进程创建另一个子 C3。第三个叉子。
-
我不认为它解释了你观察到的行为,但主进程分叉了两个孩子然后
wait()s 只为一个。 -
如何让它等待所有人?
-
@MohammadTayyab,一种方法是在您标记为“else2”的
else块末尾添加另一个对wait()的调用。