进程通信之二FIFO

简介

FIFO突破通常管道无法进行无关进程之间的通信的限制,使得同一主机内的所有的进程都可以通信。FIFO是一个文件类型,stat结构中st_mode指明一个文件结点是不是一个FIFO,可以使用宏S_ISFIFO来测试这一点。当一个FIFO存在于文件系统里时,我们只需要在想进行通信的进程内打开这个文件就可以了。当然FIFO作为一个特殊的文件,它有一些不同普通文件特性,下面会详细详述它的读写规则,这些相对精通文件来有一定的区别。我们可以使用open、read、write来操作FIFO文件,从而实现进程间通信的目的。在shell环境下,也可以直接使用FIFO,这时往往与重写向有一些关联,一般系统都提供mkfifo实用程序来创建一个FIFO文件,这个程序实际上使用mkfifo系统调用来完成这个事。

示例


/*
 * =====================================================================================
 *
 *       Filename:  fifo.c
 *
 *    Description:  IPC using fifo
 *
 *        Version:  1.0
 *        Created:  2012年02月17日 10时57分30秒
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  chn89, chn89@126.com
 *   Organization:  
 *
 * =====================================================================================
 */
#include    <stdlib.h>
#include    <stdio.h>
#include    <string.h>
#include    <sys/types.h>
#include    <sys/stat.h>
#include    <fcntl.h>

#define    FIFO    "fifo_tmp"

int
main(void)
{
    int        fdread, fdwrite;
    char buf[256];

    unlink(FIFO);
    if (mkfifo(FIFO, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ) < 0)
        printf("mkfifo error");

    if ( (fdread = open(FIFO, O_RDONLY | O_NONBLOCK)) < 0)
        printf("open error for reading\n");
    if ( (fdwrite = open(FIFO, O_WRONLY)) < 0)
        printf("open error for writing\n");
    write(fdwrite,"fsfd",4);
    read(fdread,buf,256);
    printf("%s\n",buf);
    exit(0);
}
注意事项:


(1)管道数据的FIFO处理方式,首先放入管道的数据,在端口首先被读出
(2)管道数据的不可再现性,已读取的数据在管道里消失,不能再读
(3)管道长度的有限性
(4)SIGPIPE信号 如果一个进程试图写入到一个没有读取到进程的管道中哦你,系统内核产生SIGPIPE信号


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值