我有2个不相关的过程。第一个创建FIFO通道并将数据写入其中。
testcomp:
int main(int argc, char *argv[])
{
int f1;
char *send_buf = "Hello";
char recv_buf[128] = {0};
if (mkfifo("mk.fifo", S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) == -1 && errno != EEXIST)
error(0, errno, "mkfifo() error");
f1 = open("mk.fifo", O_RDWR);
perror("Opening ");
printf("Sending string '%s'...\n", send_buf);
write(f1, send_buf, strlen(send_buf));
perror("Writing ");
close(f1);
return 0;
}
第二个过程应该从先前创建的通道读取数据。
test2comp:
int main(int argc, char *argv[])
{
int f2;
char recv_buf[128] = {0};
f2 = open("mk.fifo", O_RDONLY|O_NONBLOCK);
perror("Opening ");
read(f2, recv_buf, sizeof(recv_buf));
perror("Reading ");
printf("Received string '%s'\n", recv_buf);
close(f2);
return 0;
}
问题是读取的数据为空。可能是什么原因?
控制台输出:
FIFO只是一个命名管道。
它必须在两端都打开[,以便进行通信。例如,您当地的man page应该说类似
内核为每个特殊的FIFO维护一个管道对象由至少一个进程打开的文件。 FIFO必须打开在两端(读取和写入)可以传递数据之前。通常,打开FIFO块,直到另一端也打开。
您所做的是: