当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

C语言进程间通信(二)——命名管道

发表于: 2012-11-02   作者:ciaos   来源:转载   浏览次数:
摘要:   FIFO也称命名管道,是一种文件类型,在文件系统中可见到。管道由于没有名字,所以只能限定在亲缘关系的进程之间的通信。而通过FIFO任意进程之间都能够进行通信了。FIFO的特点如下:   命名管道可用于任何两个进程之间的通信,比管道灵活得多 命名管道作为特殊文件存在文件系统中,当进程使用结束后仍存在文件系统,需要“手动”删除 创建一个命名管道可以用mkf

 

FIFO也称命名管道,是一种文件类型,在文件系统中可见到。管道由于没有名字,所以只能限定在亲缘关系的进程之间的通信。而通过FIFO任意进程之间都能够进行通信了。FIFO的特点如下:

 

  • 命名管道可用于任何两个进程之间的通信,比管道灵活得多
  • 命名管道作为特殊文件存在文件系统中,当进程使用结束后仍存在文件系统,需要“手动”删除
创建一个命名管道可以用mkfifo [管道名],删除可以用unlink [管道名实现]。当然用C程序创建一个管道文件也是很方便的。
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>

int main(int argc, char **argv)
{
        mode_t mode = 0666;
        if (argc != 2) {
                printf("Usage: ./mkfifo.out [NAME]\n");
                exit(-1);
        }
        if ((mkfifo(argv[1], mode)) < 0) {
                printf("mkfifo error\n");
                exit(-1);
        }
        printf("created");
        return 0;
}
 写命名管道代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<sys/types.h>
#include<limits.h>
#include<string.h>

#define BUFS PIPE_BUF

void err_quit(char *msg) {
        printf("%s\n",msg);
        exit(-1);
}

int main(){
        int fd;
        if ((fd = open("fifo",O_WRONLY)) < 0) {
                err_quit("open error");
        }
        char buf[BUFS] = "Hello world";
        write(fd,buf,strlen(buf));
        return 0;
}
 发送消息方式如下
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<sys/types.h>
#include<limits.h>
#include<string.h>

#define BUFS PIPE_BUF

void err_quit(char *msg) {
        printf("%s\n",msg);
        exit(-1);
}

int main(){
        int fd;
        if ((fd = open("fifo",O_RDONLY)) < 0) {
                err_quit("open error");
        }
        char buf[BUFS];
        int len = read(fd,buf,BUFS);
        if (len < 0) {
                err_quit("read error");
        }
        printf("Get: %s\n",buf);
        return 0;
}
 上面的代码都很浅显易懂的,如果有进程读打开FIFO,且FIFO内没有数据,则对设置了阻塞标志的读操作来说,将一直阻塞,如果没有设置阻塞标志,则读操作会返回-1,errno的值是EAGAIN。尽管当前FIFO中有数据,只要别的进程读操作在进行时,本进程也会阻塞。
对于设置了阻塞标志的写操作,当要写入的数据量不大于PIPE_BUF时,将保证写入的原子性,当没有进程在读FIFO,那么设置了阻塞标志的写进程也会阻塞。

C语言进程间通信(二)——命名管道

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
函数原型 :intmkfifo(constchar*pathname,mode_tmode); 函数说明:创建一个命名管道,如果成功则返回0,
引子 好,到这里呢,就需要介绍实现进程间通信的第四种方式了, 也就是通过命名管道来实现,前面介
http://blog.chinaunix.net/uid-26833883-id-3227144.html 前面我们学习了一下进程,我们知道多,进
Linux下的进程通信手段基本上是从UNIX平台上的进程通信手段继承而来的。而对UNIX发展做出重大贡献的
      管道是linux的一种通信方式,一种两个进程间进行单向通信的机制,它提供了简单的流控制机
一 管道的局限性 管道有两个局限性:(1)他是半双工(即数据只能在一个方向上流动)。(2)它只能
用命名管道实现进程间的通信: 命名管道概念: 命名管道是通过网络来完成进程间的通信,它屏蔽了底
有名管道(FIFO) 首先将上一节的有关有名管道的定义再贴出来 有名管道是对无名管道的一种改进,它具
一. 管道:    1.只能用于具有亲缘关系的进程之间的通信      2.半双工通信模式    3.一
本文只是一个测试例子,核心代码是kernel32.dll中的一组windows api函数,这里不深入研究,代码都在
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号