我为FIFO写了一个测试。服务器通过FIFO将字符串“hello”写入客户端。但是似乎两个进程都被阻塞了,我认为FIFO是开放的,以便服务器和客户端进行读写操作。但是这两个过程什么都不输出。
/* FIFO test */
#include <stdio.h>
#include <sys/types.h>
#include <sys.stat.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#define FIFOPATH "/home/hel/fifo" // define file path
int client(void);
int server(void);
int main(void)
{
pid_t pid;
/* create FIFO */
if (mkfifo(FIFOPATH, S_IRUSR | S_IWUSR) < 0) {
if (errno == EEXIST) { // already exists, ok
}
/* error */
else {
exit(-1);
}
}
/* create process */
pid = fork();
if (pid < 0) { // error, process exits.
exit(-1);
} else if (pid == 0) { // child, server
server();
return 0; // exit
}
/* parent, client */
client();
return 0;
}
/* server */
int server(void)
{
int ret;
int fd;
/* open fifo for writing */
if ((fd = open(FIFOPATH, 0200)) < 0) {
printf("%s\n", strerror(errno));
return -1; // error
}
ret = write(fd, "hello", 5);
close(fd);
return 0;
}
/* client */
int client(void)
{
char recvBuf[100];
int fd;
int ret;
/* open fifo for reading */
if ((fd = open(FIFOPATH, 0400)) < 0) {
printf("%s\n", strerror(errno));
return -1; // error
}
ret = read(fd, recvBuf, 5);
printf("ret: %d %d\n", ret, fd);
printf("client receive %s\n", recvBuf);
close(fd);
return 0;
}
最佳答案
您的代码有两个问题。第一个是主要问题。
flags
的open
参数不正确。正如您所提供的那样,它们不应该是Unix文件许可标志。服务器应使用O_WRONLY
,客户端应使用O_RDONLY
。 write(fd, "hello", 5);
和read(fd, recvBuf, 5);
不写入和读取字符串的终止NUL字符。但随后将其打印为字符串:printf("client receive %s\n", recvBuf);
。这将调用“未定义行为”(即使很有可能该程序似乎在“工作”)。将5
更改为6
。 关于c - 为什么在打开FIFO时进程被阻塞,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38176494/