我一直在尝试围绕FIFO,并提出了一个简单的服务器和客户端程序.
我不是想做任何花哨的事情,只是为了让一个进程扮演’服务器’的角色,这个过程将“监听”另一个进程传递的任何消息;客户端.
这是我写的:
server.c
#include
#include
#include
#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&的背景下运行时,这非常简单.它在读取调用时被阻塞,并等待任何人写入clientToServer.fifo.到现在为止还挺好.
现在,考虑客户端:
client.c
#include
#include
#include
#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;
}
这是客户.也很简单的代码.当我从shell运行./a.out时,它可以工作 – 它发送消息,而server.out进程打印你发送%s到服务器.
问题是,当我通过客户端将Quit发送到服务器时,尽管a.out进程根据需要终止,但server.out中的while循环也会中断.意思是,read不再阻塞server.out进程并等待其他客户端,而是服务器程序与客户端一起结束.
为什么会这样?即使在a.out进程结束后,read也不应该再次暂停server.out?