【发布时间】:2020-05-05 22:44:05
【问题描述】:
我必须编写一个简短的程序,创建两个子进程,每个子进程从键盘接受一个整数并将它们写入管道,父进程从管道汇总它们并在屏幕上显示总数。
我用 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);
}
【问题讨论】:
-
您需要在进程之间进行一些同步,以确保它们不会同时尝试从终端读取;否则 AFAIK 你不能确定哪一个会得到数据。另请注意,子进程将继续运行通过
if(fork()==0)块,因此您可能希望在该块的末尾放置一个_exit()。 -
输入数字后是否按 Enter 键?
-
@NateEldredge 你能帮忙实现同步吗?我知道我需要一个信号量或互斥体,但我不知道在运行代码时如何区分两个孩子。我也会把 _exit() 命令放在代码的末尾。
-
@Joseph SIble-Reinstate Monica 是的,我是,但它只是换了一个新行。
-
由于孩子们都做同样的事情,你不需要区分他们。他们都可以尝试锁定信号量;一个会成功,另一个会等到第一个解锁它。