so.*_*red 5 c linux posix fifo
我一直在尝试围绕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;
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,这是非常直接的,当我在后台运行它时,./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;
}
Run Code Online (Sandbox Code Playgroud)
这是客户.也很简单的代码.当我运行它./a.out从壳,它工作-它发送消息,并且server.out过程打印You sent %s to server.
问题是,当我发送Quit通过客户机到服务器,虽然a.out根据需要,该过程终止while在环路server.out中断,以及.意思是,read不再阻止server.out进程并等待其他客户端,而是服务器程序与客户端一起结束.
为什么会这样?即使在流程结束后,也不应该再次read暂停?server.out a.out
当我在后台使用./server.out&运行它时,它在读取调用时被阻止并等待任何人写入clientToServer.fifo
实际上它阻止了open.这是FIFO工作的方式.在open(阻塞模式)将会阻塞,直到东西打开FIFO的另一端.
server.out中的while循环也会中断.意思是,read不再阻塞server.out进程并等待其他客户端,而是服务器程序结束
同样,这是正常行为.只有一个客户端进程连接到FIFO,因此当它关闭时,则发送EOF并退出服务器.如果同时将多个客户端连接到FIFO,则在最后一个客户端关闭它之前,您将看不到EOF.如果您希望长时间运行的服务器连续为多个客户端提供服务,最简单的方法是将服务器的FIFO打开为读/写.这种方式总是有一个读写器 - 服务器本身 - 即使最后一个客户端退出也不会看到EOF.当关闭服务器的时候,然后关闭服务器中的适当的一端,让自然在真正的客户退出时采取自己的方式.
| 归档时间: |
|
| 查看次数: |
26595 次 |
| 最近记录: |