美文网首页
进程间通信之有名管道

进程间通信之有名管道

作者: Jake_Yang | 来源:发表于2019-06-28 16:20 被阅读0次

1 有名管道

有名管道与无名管道的通信机制差不多,唯一不同在于,有名管道需要在文件系统中创建指定名称的管道文件,用于通信。
一旦创建好一个有名管道文件,任何进程都可以打开该文件,并进行读写操作。因此有名管道可以用在无父子关系的进程间通信。

2 接口

2.1 创建

Linux下使用mkfifo接口来创建管道文件,接口原型如下。

#include <sys/types.h>
#include <sys/stat.h>

int mkfifo(const char *pathname, mode_t mode);
  • pathame: 要创建的管道文件名
  • mode: 指定文件的读写权限
  • 返回值:成功返回0,失败返回-1

2.2 打开、关闭及读写操作

有名管道的打开、关闭及读写操作与普通文件,采用open、close、write、read等系统文件操作接口来操作管道。
在操作有名称管道时,需要注意:

  • 打开管道的读写模式要么只读,要么只写,不可同时在一个文件描述符上设置可读写模式,这样也就失去管道的意义了
  • 阻塞问题:如果打开选项设置O_NONBLOCK参数,则表示打开操作为非阻塞,如果不带该参数,则表示打开操作是阻塞的。
    具体有以下两种情况
    (1)对于以只读方式(O_RDONLY)打开有名管道,如果调用open是阻塞的,那么除非有一个进程以写方式打开同一个有名管道,否则一直阻塞在open调用中;如果open是非阻塞的,则open调用后会立即返回。
    (2)对于以只写方式(O_WRONLY)打开有名管道,如果调用open是阻塞的,那么除非有一个进程以只读方式打开同一个有名管道;否则将一直阻塞在open调用中;如果open是非阻塞的,则open调用后会立即返回,但如果没有其他进程以只读方式打开同一个有名管道open调用将返回-1,并且有名管道也不会被打开。

3 示例

3.1 发送程序

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    if (mkfifo("/tmp/fifo", 0666) < 0) {
        printf("make fifo failed\n");
        return -1;
    }
    int fd = ::open("/tmp/fifo", O_WRONLY);
    if (fd < 0) {
        printf("Open fifo file failed\n");
        return -1;
    }
    ::write(fd, "Hello", 6);
    ::close(fd);
    return 0;
}

3.2 接收程序

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv)
{
    int fd = ::open("/tmp/fifo", O_RDONLY);
    if (fd < 0 ) {
        printf("%s(%s[%d]): watcher init failed", __FILE__, __func__, __LINE__);
        return;
    }

    char msg[6];
    ::read(fd,  msg, 6);
    printf("receive message: %s\n", msg);
    return 0;
}

相关文章

  • Linux进程间通信

    Linux进程间通信的概念 linux下进程间通信的几种主要手段简介: 管道(Pipe)及有名管道(named p...

  • 进程间通信方式

    管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字...

  • 进程通信方式

    1、管道与有名管道管道可用于具有亲缘关系的父子进程间通信,有名管道除了具有管道的特点外,还允许无亲缘关系的进程进行...

  • PHP进程间通信--消息队列

    前面介绍了怎么通过消息管道(有名消息管道)进行进程间通信,下面介绍如何通过消息队列实现进程间通信。 首先我们来看一...

  • 系统编程(4)

    哲学家就餐问题: 进程间通信 无名管道,需要亲子进程来实现 利用有名管道产生不同窗口的本地聊天 共享内存间通信,使...

  • LInux进程之间的通信-有名管道(FIFO)

    Linux进程间的通信-有名管道FIFO 管道的通信只能存在于具有亲缘关系的进程之间,比如fork出来的子进程与父...

  • 14.进程间通信:管道

    1. 管道,有名管道和无名管道。 1.1 无名管道主要用于父子进程或者兄弟关系的进程间的通信。通过pipe创建无名...

  • 使用os pipe管道使python fork多进程之间通信

    管道(pipe) 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功...

  • 线程-进程间通信(操作系统、java、android)最全总结!

    大纲 操作系统进程间通信 进程的通信机制主要有:管道、有名管道、消息队列、信号量、共享空间、信号、套接字。 操作系...

  • 进程间通信(3)-有名管道

    正由于这无名管道的缺点,对无名管道进行改进:有名管道。所谓的有名,即文件系统中存在这个一样文件节点,每一个文件节点...

网友评论

      本文标题:进程间通信之有名管道

      本文链接:https://www.haomeiwen.com/subject/emvscctx.html