不过,他们并不是父母和孩子的过程。
使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标志)。