当前位置: 技术问答>linux和unix
请教各位fifo的问题。(菜鸟级)
来源: 互联网 发布时间:2015-10-29
本文导语: fifo server 创建一个只读非阻塞的fifo,并且用一个死循环来等待client端的输入(一直运行中)。用的是fgets client端使用只写方式打开fifo往里面写信息。写完后server端就可以读出,然后继续等待输入。 现在的问题是:...
fifo server 创建一个只读非阻塞的fifo,并且用一个死循环来等待client端的输入(一直运行中)。用的是fgets
client端使用只写方式打开fifo往里面写信息。写完后server端就可以读出,然后继续等待输入。
现在的问题是:client端写进去了,server并不马上读出。但确认是写进去了。
没有处理非阻塞fifo的经验。如果想要server做到写一次读一次的话(client端打开,写入,关闭。则fifo把此次写入的读出。),server端和client端有什么特别要注意的地方?或者说如何实现这样的功能?
2。我发现server打开fifo后,返回的文件描述符是4,而client端是3,会有影响吗?还是说本来不同进程对同一文件就有可能返回不同的文件描述符?
3. 当server进入死循环了(比如用while(1) ),是不是应该client端写完后发个信号给它,它才开始读,不然的话,这边还没写完,那边开始读了,岂不是会出问题?
好多问题,谢谢各位了。分不够可以另开一个帖子
client端使用只写方式打开fifo往里面写信息。写完后server端就可以读出,然后继续等待输入。
现在的问题是:client端写进去了,server并不马上读出。但确认是写进去了。
没有处理非阻塞fifo的经验。如果想要server做到写一次读一次的话(client端打开,写入,关闭。则fifo把此次写入的读出。),server端和client端有什么特别要注意的地方?或者说如何实现这样的功能?
2。我发现server打开fifo后,返回的文件描述符是4,而client端是3,会有影响吗?还是说本来不同进程对同一文件就有可能返回不同的文件描述符?
3. 当server进入死循环了(比如用while(1) ),是不是应该client端写完后发个信号给它,它才开始读,不然的话,这边还没写完,那边开始读了,岂不是会出问题?
好多问题,谢谢各位了。分不够可以另开一个帖子
|
恭喜,我以前也有这样的经历,必须读到n 才算读完。
|
1. “服务端并步马上读出”--这句中的马上一般是多久,一般由于进程调度算法以及网络情况,可能实时性不会很好。
2. 没问题,每个进程都有自己的文件描述符列表,不同进程间的不同描述符可能指向相同的文件。
3.发信号是一种有效的同步与缓冲机制。
2. 没问题,每个进程都有自己的文件描述符列表,不同进程间的不同描述符可能指向相同的文件。
3.发信号是一种有效的同步与缓冲机制。
|
fifo并不是一种很好的c/s方式,特别是client不是一个的时候。你可以用其他方式比如本地socket(UNIX DOMAIN)。
3、一定要信号进行同步,否则你的数据组织比较麻烦
给个例子,perl写的,非阻塞读socket,类似
while ($read_done == 0) {
my $nread = read($socket,$line,$MAX_INPUT_LENGTH);
if (!(defined($nread))) {
if ($! == EAGAIN) {
# errno是EAGAIN的话,忽略,重读
} else {
$read_done=1;
}
}
}
3、一定要信号进行同步,否则你的数据组织比较麻烦
给个例子,perl写的,非阻塞读socket,类似
while ($read_done == 0) {
my $nread = read($socket,$line,$MAX_INPUT_LENGTH);
if (!(defined($nread))) {
if ($! == EAGAIN) {
# errno是EAGAIN的话,忽略,重读
} else {
$read_done=1;
}
}
}