我一直在尝试了解 FIFO,并提出了一个简单的服务器和客户端程序。
我不想做任何花哨的事情,只是让一个进程扮演“服务器”的角色,这个进程将“监听”另一个进程传递的任何消息;客户端。
这是我写的:
server.c
#include<stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#define INGOING "clientToServer.fifo"
#define BUFFER 200
int main(int argc, char *argv[]) {
char in[BUFFER];
mkfifo(INGOING, 0666);
printf("Welcome to server.\n");
printf("channel for sending messages to server is %s\n", INGOING);
int in_fd=open(INGOING, O_RDONLY);
if (in_fd==-1) {
perror("open error");
exit(-1);
}
while (read(in_fd, in, BUFFER)>0) {
printf("You sent %s to server.\n", in);
}
return 2;
}
正如你所看到的,当我在后台运行它时,这非常简单./server.out&
它被阻止在read
打电话并等待有人写信clientToServer.fifo
。到目前为止,一切都很好。
现在,考虑客户端:
client.c
#include<stdio.h>
#include<fcntl.h>
#include<string.h>
#define BUFFER 200
int main(int argc, char *argv[]) {
char input[BUFFER]={0};
int out_fd=open("clientToServer.fifo", O_WRONLY);
if (out_fd==-1) {
perror("open error");
}
while (1) {
printf("What would you like to send to server? (send Quit to quit)\n");
fgets(input, BUFFER, stdin);
if (input[strlen(input)-1]=='\n') {
input[strlen(input)-1]='\0';
}
if (strcmp(input, "Quit")==0) {
printf("Bye!");
break;
}
if (write(out_fd, input, strlen(input))==-1) {
perror("write error");
}
}
return 1;
}
这是客户。代码也很简单。当我运行它时./a.out
从 shell 中,它可以工作 - 它发送消息,并且server.out
工艺印刷品You sent %s to server.
问题是,当我发送Quit
通过客户端到服务器,虽然a.out
进程根据需要终止,while
循环中server.out
也休息。意思是,read
不再阻止server.out
处理并等待其他客户端,相反,服务器程序与客户端一起结束。
为什么会发生这种情况?不应该read
暂停server.out
again,即使在a.out
进程结束?