fifo (有名管道) 可以方便地实现多个进程间通信,但是当读取方没有及时读取的时候,写入方还能写入多少数据?
下面是一个小实验,记在这里备忘。两个进程,一读一写。写入方先循环写,我们看到底能写入多少。然后再启动读取进程,观察写入方的动作。
首先创建一个 fifo:
mkfifo /tmp/a.fifo
接着写一个进程用来向这个 fifo 写入,并且记录下写入的大小:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
char buf[4096] = {0};
int n, i = 0;
int fd = open("/tmp/a.fifo", O_RDWR);
printf("time\t\tseq\twrite\ttotal\n");
while (1) {
int ret = write(fd, buf, sizeof(buf));
if (ret >= 0)
n += ret;
else
break;
printf("%u\t%d\t%d\t%d\n", time(NULL), i++, ret, n);
}
return 0;
}
|
然后是读取进程:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
char buf[4096] = {0};
int n, i = 0;
int fd = open("/tmp/a.fifo", O_RDWR);
read(fd, buf, 1024);
return 0;
}
|
都准备完后,先启动写入:
time seq write total
1271646394 0 4096 4096
1271646394 1 4096 8192
1271646394 2 4096 12288
1271646394 3 4096 16384
1271646394 4 4096 20480
1271646394 5 4096 24576
1271646394 6 4096 28672
1271646394 7 4096 32768
1271646394 8 4096 36864
1271646394 9 4096 40960
1271646394 10 4096 45056
1271646394 11 4096 49152
1271646394 12 4096 53248
1271646394 13 4096 57344
1271646394 14 4096 61440
1271646394 15 4096 65536
|
在写入了 16 个页面也就是 65536 字节后,写入进程阻塞了,接下来用读取进程每次读 1024 字节
在读了 4 次后,发现 writer 又入了 4KB 后再次阻塞。
得出结论,
1 fifo 的缓冲大小默认是 16 * 4KB
2 缓冲单位是 4KB 也就是页面大小。不知道在大页面的系统上结果是什么样子的,晚上回去在我的 x86_64 上试一下。
想起之前做的另一个试验,用 open(O_RDWR) 拿到一个 fifo 的 fd 后,用同一进程在这个 fifo 上读写都是可以的,读出来的东西就是写进去的数据。所以如果两个进程用 fifo 做交互的 IPC,貌似需要启两个fifo 才行。
阅读(4674) | 评论(0) | 转发(0) |