gpt4 book ai didi

linux - 使用管道和文件进行进程间通信

转载 作者:太空狗 更新时间:2023-10-29 12:28:21 25 4
gpt4 key购买 nike

我正在使用 Linux 作为操作系统,并尝试通过管道和文件来通信三个进程。它应该适用于放在 STDIN 上的任何文件。管道工作正常,但第二个进程无法将一个字符正确写入文件或第三个进程无法读取。首先,当然我将函数初始化为 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);
}

最佳答案

是什么让您认为 child 先跑?您还没有等待子进程完成,所以可以在前一个子进程写入之前点击 EOF 读取文件。最后一个 fork() 调用不应该是等待,所以您知道文件已写入吗?就目前而言,您有 4 个进程,而不是 3 个!!

然后您将关闭第二个子进程中的 mypipe[1],因为它是一个 fork 副本,所以不会关闭第一个子进程中的管道。您还尝试编写 BUFSIZ 字符,因此您似乎正在尝试写出比写入的字符更多的字符,请尝试“write (mypipe[1], &d, strlen(d));”。

在字符读/写循环中使用 fopen() 和 fclose() 看起来很奇怪。您真的要一遍又一遍地重新打开文件并将 1 个字符重新写入文件吗?

类似地,process2 文件似乎被重新打开,因此如果文件非空,其中的第一个字符将被一次又一次地写入。

肯定还有其他错误,但现在应该对您有所帮助。

关于linux - 使用管道和文件进行进程间通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34842449/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com