Chinaunix首页 | 论坛 | 博客
  • 博客访问: 66486
  • 博文数量: 4
  • 博客积分: 1421
  • 博客等级: 上尉
  • 技术积分: 116
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-03 11:28
文章分类
文章存档

2010年(3)

2009年(1)

我的朋友

分类: LINUX

2010-04-19 11:21:02

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) |
0

上一篇:mtrace 检查 memory leak(内存泄漏)实验

下一篇:没有了

给主人留下些什么吧!~~