我要做一个简短的程序,创建两个子进程,每个子进程接受来自键盘的整数,并将它们写入一个管道,由父进程将它们汇总并在屏幕上显示总数。
我已经用scanf()写了一个,但它冻结了,而且它没有给我总数。 如果可能的话,我如何用scanf或其他方法使它工作?
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int pipe(int pd[2]);
int main(int argc, char *argv[])
{
int pd[2], sum=0, num=0;
if(pipe(pd) == -1)
for(int i = 0; i < 2; i++)
{
if(fork() == 0)
{
scanf("%d", num);
if(write(pd[1], &num, sizeof(int)) == -1)
printf("Error: Write()");
}
}
for(int j = 0; j < 2; j++)
{
wait(NULL);
if(read(pd[0], &num, sizeof(int)) == -1)
printf("Error: Read()");
sum += num;
}
printf("Total: %d\n", sum);
}
这里有很多问题。
if(pipe(pd) == -1)
我假设你的意思是要为它设置一个错误处理程序作为 "then "子句,但你没有,所以只有在管道失败时才会产生孩子,这基本上与你想要的相反。scanf("%d", num);
. 你需要 &num
自从 num
是不是已经是一个指针。return
或 exit
的子进程,否则它们就会陷入下一个循环并消耗输出。只要把这些东西固定下来,就足以让它工作了。
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int pipe(int pd[2]);
int main(int argc, char *argv[])
{
int pd[2], sum=0, num=0;
if(pipe(pd) == -1)
{
perror("pipe");
return 1;
}
for(int i = 0; i < 2; i++)
{
if(fork() == 0)
{
scanf("%d", &num);
if(write(pd[1], &num, sizeof(int)) == -1)
printf("Error: Write()");
return 0;
}
}
for(int j = 0; j < 2; j++)
{
wait(NULL);
if(read(pd[0], &num, sizeof(int)) == -1)
printf("Error: Read()");
sum += num;
}
printf("Total: %d\n", sum);
}
还有一些其他的东西你也应该修正, 但它们并不是完全的障碍。下面是我跳出来的东西。
pipe
原型。unistd.h中的那个就可以。fork
或 scanf
失败。