我一直试图围绕FIFO,并提出了一个简单的程序的服务器和客户端。
我不是想做任何事情,只是为了让一个进程扮演'服务器'的角色,这个进程将'监听'由另一个进程传递的任何消息;客户端。
这是我写的:写入/读取/从FIFO文件 - linux
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
从外壳运行它,它的工作原理 - 它发送消息,并且server.out
过程打印You sent %s to server.
问题是,当我通过客户端向服务器发送Quit
,尽管如所期望的a.out
进程终止时,while
环在server.out
也休息。这意味着,read
不再阻止server.out
进程并等待其他客户端,而是服务器程序与客户端一起结束。
这是怎么发生的? read
应该不会暂停server.out
再次,即使在a.out
过程结束后?
您的代码中存在未定义的行为:您从客户端发送没有终止符的字符串,并且在未添加添加终止符的情况下读取该字符串,这意味着服务器中的printf会打印未终止的字符串。 –
@JoachimPileborg,so:'write(out_fd,input,strlen(input)+1)'? –
否:'int nbytes; while((nbytes = read(in_fd,in,sizeof(in)))> 0)printf(“您发送[%。* s]到服务器\ n”,nbytes,in);'方括号在哪里分隔发送的数据(因此是可选的)。 –