Chinaunix首页 | 论坛 | 博客
  • 博客访问: 345080
  • 博文数量: 59
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 646
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-14 12:09
文章分类

全部博文(59)

文章存档

2009年(2)

2008年(57)

我的朋友

分类: C/C++

2008-07-21 12:16:15

看了进程间通信,学习了管道,下面是我的一点理解:
1.在程序的开头定义一下文件名,可以包含路径如#define FIFO_SERVER "/tmp/fifoserver"也可不包含路径如char write_fifo_name[]="write-fifo";可以用宏定义,也可以用字符串,这个定义不是必须的,但是在开头定义一下会使程序条理清楚。
2.一个程序中可以创建多个不同的FIFO。
3.用mkfifo函数创建FIFO,函数说明如下:
mkfifo(建立实名管道)
相关函数
    pipe,popen,open,umask
表头文件
    #include
    #include
定义函数
    int mkfifo(const char * pathname,mode_t mode);
函数说明
    mkfifo()会依参数pathname建立特殊的FIFO文件,该文件必须不存在,而参数mode为该文件的权限(mode%~umask),因此 umask值也会影响到FIFO文件的权限。Mkfifo()建立的FIFO文件其他进程都可以用读写一般文件的方式存取。当使用open()来打开 FIFO文件时,O_NONBLOCK旗标会有影响
    1、当使用O_NONBLOCK 旗标时,打开FIFO 文件来读取的操作会立刻返回,但是若还没有其他进程打开FIFO 文件来读取,则写入的操作会返回ENXIO 错误代码。
    2、没有使用O_NONBLOCK 旗标时,打开FIFO 来读取的操作会等到其他进程打开FIFO文件来写入才正常返回。同样地,打开FIFO文件来写入的操作会等到其他进程打开FIFO 文件来读取后才正常返回。
返回值
    若成功则返回0,否则返回-1,错误原因存于errno中。
错误代码
    EACCESS 参数pathname所指定的目录路径无可执行的权限
    EEXIST 参数pathname所指定的文件已存在。
    ENAMETOOLONG 参数pathname的路径名称太长。
    ENOENT 参数pathname包含的目录不存在
    ENOSPC 文件系统的剩余空间不足
    ENOTDIR 参数pathname路径中的目录存在但却非真正的目录。
    EROFS 参数pathname指定的文件存在于只读文件系统内。
4.创建完成后,在使用之前,要用open函数打开创建的fifo,成功返回0,失败返回-1
5.如果有两个程序要进行交互,则要创建两个fifo, 一个读,一个写,在相应的另一个程序中是写和读。
6.注意读写原子性,还有阻塞位。具体内容参照:http://www.ibm.com/developerworks/cn/linux/l-ipc/part1/index.html
7.往fifo中写,和从fifo中读,用write 和read函数,成功则返回读入写入的字节数,失败则返回-1.
8.关于打开规则,fifo的读打开和写打开之间存在依赖,要同时存在。


不明白的问题:阻塞位是在读写自动应用的,可不可以人为控制呢?
阅读(1982) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

zhxiong.linux2008-07-28 22:24:34

>mkfifo()会依参数pathname建立特殊的FIFO文件,该文件必须不存在 当文件存在时,创建的返回值为-1,但你的程序依然可以用这个已经存在的文件,你的聊天程序如果删掉下面这几行代码,就可以不用每次运行程序前必须删掉 已经存在的FIFO文件了。 if(ret==-1) {printf("failed to create FIFO %s:%s\n",write_fifo_name,strerror(errno)); exit(-1); }