我使用linux作为操作系统并尝试使用管道和文件来传达三个进程。它应该适用于STDIN上的任何文件。 并且管道工作得很好,但第二个进程无法将一个char正确写入文件或第三个读取。 首先当然我初始化函数作为semlock和semunlock和开放管道也在那里。我感谢任何帮助,因为我不知道。
if (!(PID[1] = fork ())) {
int BUF_SIZE = 4096;
char d[BUF_SIZE];
while (fgets (d, BUF_SIZE, stdin) != NULL) {
write (mypipe[1], &d, BUF_SIZE);
}
}
if (!(PID[2] = fork ())) {
int reading_size = 0;
char r;
close (mypipe[1]);
semlock (semid1);
while (reading_size = read (mypipe[0], &r, 1)) {
if ((file = fopen ("proces2.txt", "w")) == NULL) {
warn ("error !!!");
exit (1);
}
fputc (r, file);
fclose (file);
semunlock (semid2);
}
}
if (!(PID[3] = fork ())) {
char x;
semlock (semid2);
do {
if ((plikProces3 = fopen ("proces2.txt", "r")) == NULL) {
warn ("Blad przy otwarciu pliku do odczytu !!!");
exit (1);
}
i = getc (plikProces3);
o = fprintf (stdout, "%c", i);
fclose (plikProces3);
semunlock (semid1);
} while (i != EOF);
}
答案 0 :(得分:1)
是什么让你认为孩子先跑?您还没有等待子进程完成,因此可以在上一个孩子写完之前点击EOF读取文件。最后一个fork()调用是不是等待,所以你知道文件是写的吗?目前,您有4个流程,而不是3个!!
然后你在第二个子进程中关闭mypipe [1],因为它是一个分叉副本,不会关闭第一个子进程中的管道。你也试图写BUFSIZ字符,所以你似乎试图写出比写的更多的字符,试试"写(mypipe [1],& d,strlen(d));"
看起来很奇怪,拥有fopen()&字符读/写循环中的fclose()。你真的想重新开放&一遍又一遍地将1个字符重写到文件中?
类似地,process2文件似乎被重新打开,因此如果它是非空的,则会反复写入第一个字符。
肯定会有其他错误,但这对你现在应该有所帮助。