我的任务是:
a) 检查命名管道的容量 (FIFO)
b) 在再次写入之前检查需要从完整管道读取多少字节。
我的代码成功写入管道,直到它已满并表示其容量为 65536 字节,但随后读取失败(if 条件检查的值为 -1),并且由于我未知的原因,它设法写入没有读任何东西就满管了。读取失败的错误代码是“资源暂时不可用”。下面是我的代码,为了清楚起见,删除了调试打印。代码的输出是“读取0字节后写入成功”。
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <fcntl.h>
int main() {
int l = 0;
int stream;
char* fifo = "/tmp/fifo";
mkfifo(fifo, 0666);
char test = 255;
int p = fork();
char readtest;
if (p > 0) { //rodzic
wait(NULL);
stream = open(fifo, O_RDWR | O_NONBLOCK);
while (1) {
if (read(stream, &readtest, 1) == 1) {
l++;
printf("Read byte %d, attempting write", l);
}
if (write(stream, &test, 1) == 1) {
printf("Write successful after reading %d bytes\n", l);
return 0;
}
}
} else if (p == 0) { //dziecko
stream = open(fifo, O_RDWR | O_NONBLOCK);
while (write(stream, &test, 1) == 1 ) {
l++;
//printf("b%d\n", l);
}
close(stream);
printf("Wrote %d bytes, pipe full\n", l);
_Exit(0);
}
在这种情况下,父级和子级从不同的管道读取。 通常(非非阻塞),当您打开一个 fifo 进行写入时,打开的操作将不会返回,直到其他进程打开相同的 fifo 进行读取。 此时,这两个进程共享一个管道。 由于您的孩子正在非阻塞地打开 fifo,因此它不会等待读者。 当孩子关闭管道时,它写入的所有数据都会消失在以太中。 父进程随后打开 fifo 并获得一个从未被写入的不同管道。