FIFO问题与并发进程

不过,他们并不是父母和孩子的过程。

使FIFO:

/* Create response FIFO. */ if (mkfifo(RESP_FIFO_NAME, FIFO_MODE) == -1) { if (errno != EEXIST) { fprintf(stderr, "Server: Couldn't create %s FIFO.\n", RESP_FIFO_NAME); exit(1); } } 

叉子:

 /* 3. Fork the client process. */ switch (fork()) { /* Fork failed. */ case (pid_t) -1: fprintf(stderr, "Call to fork failed.\n"); exit(1); /* Client (child) process. */ case 0: execlp(CLIENT_NAME, CLIENT_NAME, argv[SERVER_CMD_FILE_ARG], argv[SERVER_LOG_FILE_ARG], NULL); /* Server (parent) Process */ default: sleep(1); server(infd, outfd, argv[INIT_DB_ARG], argv[FINAL_DB_ARG]); } /* End of switch. */ 

服务器function:

 int server(int infd, int outfd, char *init_db_name, char *final_db_name) { ... if ((outfd = open(RESP_FIFO_NAME, O_WRONLY)) == -1) { fprintf(stderr, "Server: Failed to open %s FIFO.\n", RESP_FIFO_NAME); perror(RESP_FIFO_NAME); exit(1); } ... } 

客户端程序:

 printf("RESP_FIFO FILE DESCRIPTOR: %d\n", infd); /* Open the response FIFO for reading. */ if ((infd = open(RESP_FIFO_NAME, O_RDONLY)) == -1) { fprintf(stderr, "Client: Failed to open %s FIFO.\n", RESP_FIFO_NAME); exit(1); } else printf("RESP_FIFO FILE DESCRIPTOR: %d\n", infd); 

TL; DR在服务器程序中打开写入调用之前,客户机程序中的读取调用的开放未被执行。

在另一端开放阅读之前,你是否打开了写作回应的先决条件? 见fex。 在C中打开FIFO时遇到问题

要么等到你知道FIFO是打开读取还是打开阻塞,等待客户端。 还要确保服务器具有对FIFO文件的写入权限。

那么pipe()是什么呢

从管道(2) :

为进程间通信创建描述符对。 

pipe()函数创建一个管道(一个允许单向的对象
数据流)并分配一对文件描述符。 第一个描述 –
tor连接到管道的读取端; 第二连接到
写完。

写入到fildes 1的数据出现在fildes [0]上(即,可以从中读取)。

你可以看看memcached如何使用它

是的,没有阅读器,用于写入的文件系统FIFO的open()会阻塞,或者在非阻塞情况下,ENXIO会失败。

你至少有两个简单的选择。

首先, 除了写入O_RDWR或两个单独的文件描述符(一个O_RDONLY和一个O_WRONLY) ,还可以打开用于读取的“命令”FIFO。

其次,您可以使用文件系统套接字 ,并让服务器在那里监听。 这给了你一个双向的双向沟通​​渠道。

UNIX也给了你其他的选择 – 消息队列或文件或共享内存段,也许使用一个对话者的信号来刺激另一个对象,但是上述内容非常简单。

我在一端写入一个FIFO而不读另一端。 只要读取和写入文件是不够的,您必须从FIFO中读取文本,否则程序将会出错(ENXIO如果您设置了O_NONBLOCK标志)。