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,那么设置了阻塞标志的写进程也会阻塞。
分享到:
相关推荐
首先,我们关注的是进程间通信的一个常见方法——管道(Pipe)。管道是一种半双工通信方式,允许数据在一个方向上流动。在实验中,我们使用`pipe()`函数创建了一个管道。`pipe()`函数接受一个整型数组`filedes[2]`...
本实验“FIFO管道命名实验”聚焦于一种特定的进程间通信(IPC)方式——命名管道(Named Pipe),也称为FIFO(先进先出)文件。下面我们将深入探讨命名管道的概念、工作原理以及如何通过C语言实现。 命名管道是Unix...
管道(包括无名管道和命名管道)为进程间通信提供了一种简单而有效的方式。通过合理地选择和使用这些机制,可以极大地提高程序的设计灵活性和性能效率。无论是简单的父子进程通信还是更复杂的多进程数据交换场景,...
3. **作业FIFO(先进先出)**:"作业FIFO.doc"可能涉及到了进程间通信的一种方式——命名管道(FIFO)。FIFO是一种半双工的通信方式,数据只能单向流动,常用于具有亲缘关系的进程之间。通过mkfifo()函数创建FIFO,...
命名管道(FIFO)比匿名管道更灵活,允许不相关的进程间通信。实验涵盖了`mkfifo()`创建命名管道,以及`open()`, `read()`, `write()`等函数进行读写操作。 6. **实验6 信号量实现进程同步**: 这个实验的重点...
在实际的开发过程中,除了`fork()`,还可以使用其他IPC(Inter-Process Communication,进程间通信)机制来增强聊天程序的功能,例如: - **管道(Pipe)**:简单且直接的数据通道,允许一个进程向另一个进程写入...
第6章 传统的Unix进程间通信 6.1 概述 6.2 管道和系统调用pipe() 6.3 命名管道 6.4 信号 6. 5 系统调用ptrace()和进程跟踪 6.6 报文传递 6.7 共享内存 6.8 信号量 第7章基于socket的进程间通信 7.1...
第6章 传统的Unix进程间通信 6.1 概述 6.2 管道和系统调用pipe() 6.3 命名管道 6.4 信号 6.5 系统调用ptrace()和进程跟踪 6.6 报文传递 6.7 共享内存 6.8 信号量 第7章基于socket的进程间通信 7.1系统调用...
- **概述**:讲解了管道(Pipe)作为进程间通信的一种简单高效机制。 - **学习要点**: - 管道的工作原理。 - 使用C语言创建和使用管道的方法。 - 管道使用的注意事项。 **4.4 有名管道** - **概述**:介绍了...
- **管道与命名管道**:介绍了两种基本的进程间通信方式——管道和命名管道的工作原理及应用场景。 - **消息队列**:讲解了消息队列这种高效的IPC机制,包括其工作流程和使用方法。 - **共享内存**:探讨了共享内存...
- **进程通信概述**:在单机系统中,进程可以通过管道、命名管道、软中断信号等方式进行通信。然而,在网络环境中,这些方法不再适用,因为不同主机上的进程需要跨网络进行通信。 - **进程标识问题**:在单机系统中...
例如,它采用了9P协议,这是一种用于在Plan 9系统中进行文件和进程间通信(IPC)的网络协议。9P允许不同机器上的文件系统像本地文件一样被访问,提供了无缝的分布式计算体验。此外,HarveyOS还使用了C和C++语言进行...
命名管道是一种特殊类型的文件,用于进程间通信,类似于管道,但可以在不同进程间使用。 ##### 1.4.16 麦䫭䇃处理 进程的生命周期管理涉及进程的创建、终止以及资源的分配和释放等。 #### 1.5 牧牧 ㋏㒳㓪程 本...
第十五章讲述了进程间通信的一种方式——管道和命名管道(FIFO),通过这种方式,不同进程可以实现无共享内存的通信,适用于分布式或微服务架构。 15. **套接字(Sockets)** 第十六章全面介绍了网络编程的核心...
管道是一种简单的进程间通信机制,广泛应用于Unix和类Unix系统中。章节详细介绍了如何创建和使用这些管道。 #### 十六、套接字 **第十六章**“套接字”深入探讨了如何使用GNU C库中的套接字API来进行网络通信。这...
- **15 管道和命名管道**:介绍了进程间通信的基础设施之一——管道和命名管道。 - **16 套接字**:提供网络编程的基础知识,包括套接字的创建、监听、接受等操作。 - **17 低级终端接口**:介绍了终端设备的控制...
- 进程间通信(IPC)是多个进程之间交换数据和同步的方法。 - Unix提供了一系列IPC机制,如管道、信号等。 - **6.2 管道和系统调用pipe()** - 管道是一种简单的IPC机制,用于在两个进程之间传递数据。 - `pipe`...
进程间通信(IPC)是指在多个进程之间传递数据的技术。在UNIX/Linux中,IPC主要包括信号、管道、消息队列、信号量和共享内存等方式。 **4.2 信号** - **4.2.1 信号的处理**:信号是操作系统向进程发送的一种软中断...
通信编程通常涉及进程间通信(IPC, Inter-Process Communication)或者网络通信。在C/C++中,我们可以使用以下技术进行通信: 1. **管道(Pipe)**:一种简单的单向通信方式,允许父进程与子进程之间传递数据。 2. ...
第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 ...