`

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

阅读更多

 

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,那么设置了阻塞标志的写进程也会阻塞。
分享到:
评论

相关推荐

    Linux系统编程实验六进程间通信.docx

    首先,我们关注的是进程间通信的一个常见方法——管道(Pipe)。管道是一种半双工通信方式,允许数据在一个方向上流动。在实验中,我们使用`pipe()`函数创建了一个管道。`pipe()`函数接受一个整型数组`filedes[2]`...

    FIFO管道命名实验

    本实验“FIFO管道命名实验”聚焦于一种特定的进程间通信(IPC)方式——命名管道(Named Pipe),也称为FIFO(先进先出)文件。下面我们将深入探讨命名管道的概念、工作原理以及如何通过C语言实现。 命名管道是Unix...

    LINUX进程间通信:PIPE与FIFO - 山 人 - 博客园1

    管道(包括无名管道和命名管道)为进程间通信提供了一种简单而有效的方式。通过合理地选择和使用这些机制,可以极大地提高程序的设计灵活性和性能效率。无论是简单的父子进程通信还是更复杂的多进程数据交换场景,...

    Linux操作系统实验报告

    3. **作业FIFO(先进先出)**:"作业FIFO.doc"可能涉及到了进程间通信的一种方式——命名管道(FIFO)。FIFO是一种半双工的通信方式,数据只能单向流动,常用于具有亲缘关系的进程之间。通过mkfifo()函数创建FIFO,...

    操作系统实验源码.zip

    命名管道(FIFO)比匿名管道更灵活,允许不相关的进程间通信。实验涵盖了`mkfifo()`创建命名管道,以及`open()`, `read()`, `write()`等函数进行读写操作。 6. **实验6 信号量实现进程同步**: 这个实验的重点...

    史上最简单的Linux单机版聊天C程序

    在实际的开发过程中,除了`fork()`,还可以使用其他IPC(Inter-Process Communication,进程间通信)机制来增强聊天程序的功能,例如: - **管道(Pipe)**:简单且直接的数据通道,允许一个进程向另一个进程写入...

    Linux内核源代码情景分析全册

    第6章 传统的Unix进程间通信 6.1 概述 6.2 管道和系统调用pipe() 6.3 命名管道 6.4 信号 6. 5 系统调用ptrace()和进程跟踪 6.6 报文传递 6.7 共享内存 6.8 信号量 第7章基于socket的进程间通信 7.1...

    linux内核源代码情景分析

    第6章 传统的Unix进程间通信 6.1 概述 6.2 管道和系统调用pipe() 6.3 命名管道 6.4 信号 6.5 系统调用ptrace()和进程跟踪 6.6 报文传递 6.7 共享内存 6.8 信号量 第7章基于socket的进程间通信 7.1系统调用...

    linux编程.pdf

    - **概述**:讲解了管道(Pipe)作为进程间通信的一种简单高效机制。 - **学习要点**: - 管道的工作原理。 - 使用C语言创建和使用管道的方法。 - 管道使用的注意事项。 **4.4 有名管道** - **概述**:介绍了...

    高级Linux编程 Advanced Linux Programming.pdf

    - **管道与命名管道**:介绍了两种基本的进程间通信方式——管道和命名管道的工作原理及应用场景。 - **消息队列**:讲解了消息队列这种高效的IPC机制,包括其工作流程和使用方法。 - **共享内存**:探讨了共享内存...

    socket编程原理

    - **进程通信概述**:在单机系统中,进程可以通过管道、命名管道、软中断信号等方式进行通信。然而,在网络环境中,这些方法不再适用,因为不同主机上的进程需要跨网络进行通信。 - **进程标识问题**:在单机系统中...

    cpp-HarveyOS一个分布式操作系统

    例如,它采用了9P协议,这是一种用于在Plan 9系统中进行文件和进程间通信(IPC)的网络协议。9P允许不同机器上的文件系统像本地文件一样被访问,提供了无缝的分布式计算体验。此外,HarveyOS还使用了C和C++语言进行...

    linux系统编程

    命名管道是一种特殊类型的文件,用于进程间通信,类似于管道,但可以在不同进程间使用。 ##### 1.4.16 麦䫭䇃处理 进程的生命周期管理涉及进程的创建、终止以及资源的分配和释放等。 #### 1.5 牧牧 ㋏㒳㓪程 本...

    官方GNU C函数库手册

    第十五章讲述了进程间通信的一种方式——管道和命名管道(FIFO),通过这种方式,不同进程可以实现无共享内存的通信,适用于分布式或微服务架构。 15. **套接字(Sockets)** 第十六章全面介绍了网络编程的核心...

    The GNU C Library Reference Manual.pdf

    管道是一种简单的进程间通信机制,广泛应用于Unix和类Unix系统中。章节详细介绍了如何创建和使用这些管道。 #### 十六、套接字 **第十六章**“套接字”深入探讨了如何使用GNU C库中的套接字API来进行网络通信。这...

    The GNU C Library

    - **15 管道和命名管道**:介绍了进程间通信的基础设施之一——管道和命名管道。 - **16 套接字**:提供网络编程的基础知识,包括套接字的创建、监听、接受等操作。 - **17 低级终端接口**:介绍了终端设备的控制...

    Linux内核源代码情景分析 (上下册 高清非扫描 )

    - 进程间通信(IPC)是多个进程之间交换数据和同步的方法。 - Unix提供了一系列IPC机制,如管道、信号等。 - **6.2 管道和系统调用pipe()** - 管道是一种简单的IPC机制,用于在两个进程之间传递数据。 - `pipe`...

    Linux下关于网络编程

    进程间通信(IPC)是指在多个进程之间传递数据的技术。在UNIX/Linux中,IPC主要包括信号、管道、消息队列、信号量和共享内存等方式。 **4.2 信号** - **4.2.1 信号的处理**:信号是操作系统向进程发送的一种软中断...

    OOPC.rar_通讯编程_C/C++_

    通信编程通常涉及进程间通信(IPC, Inter-Process Communication)或者网络通信。在C/C++中,我们可以使用以下技术进行通信: 1. **管道(Pipe)**:一种简单的单向通信方式,允许父进程与子进程之间传递数据。 2. ...

    Linux程序设计 第4版.haozip01

    第13章 进程间通信:管道 443 13.1 什么是管道 443 13.2 进程管道 444 13.3 将输出送往popen 445 13.3.1 传递更多的数据 446 13.3.2 如何实现popen 447 13.4 pipe调用 449 13.5 父进程和子进程 451 13.5.1 ...

Global site tag (gtag.js) - Google Analytics