预告他们即使他们不是父母也不是父母的过程。
MAKE 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. */
服务器功能:
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 在打开服务器程序中的调用之前,未在客户端程序中打开读取调用。
答案 0 :(得分:1)
你是否在其另一端开放阅读之前打开了写作的响应?见fex。 Having a trouble with opening FIFO in C
要么等到你知道FIFO打开读取或打开阻塞,要等待客户端。还要确保服务器具有FIFO文件的写权限。
答案 1 :(得分:0)
这个
的pipe()
怎么样?
来自pipe(2):
Create descriptor pair for interprocess communication.The pipe() function creates a pipe (an object that allows unidirectional data flow) and allocates a pair of file descriptors. The first descrip- tor connects to the read end of the pipe; the second connects to the write end.
Data written to fildes1 appears on (i.e., can be read from) fildes[0].
您可以查看memcached如何使用它
答案 2 :(得分:0)
是的,没有阅读器,用于写入的文件系统FIFO的open()将阻塞,或者在非阻塞情况下,使用ENXIO失败。
您至少有两个简单的选择。
首先,您可以打开“命令”FIFO,非阻塞,用于读取以及以写入O_RDWR或两个单独的文件描述符,一个O_RDONLY和一个O_WRONLY。
其次,您可以使用文件系统 socket ,让服务器在那里监听。这为您提供了一个双向的双向沟通渠道。
UNIX也为您提供了其他选项 - 消息队列或文件或共享内存段,可能会使用一个对话者的信号来刺激另一个 - 但是上面的内容非常简单。
答案 3 :(得分:0)
我在一端写入了一个FIFO而没有读出另一端。只是打开文件进行读写是不够的,你必须从FIFO中读出文本,否则程序会出错(如果你设置了O_NONBLOCK标志,则为ENXIO)。