管道和FIFO

管道和FIFO

  1. 管道(pipe)

管道在Unix及Linux进程间通信是最基础的,很容易理解。管道就像一个自来水管,一端注入水,一端放出水,水只能在一个方向上流动,而不能双向流动。管道是典型的单向通信,即计算机网络中所说的“半双工”。管道又名匿名管道,所以只能用在具有公共祖先的进程之间使用,通常使用在父子进程之间通信。通常是父进程创建一个管道,然后fork一个子进程,此后父子进程共享这个管道进行通信。

  管道由pipe函数创建,函数原型如下:

#include<unistd.h>

int  pipe(int fd[2]); 成功返回0,否则返回-1;参数fd返回两个文件描述符,fd[0]为读,fd[1]为写,fd[1]的输入是fd[0]的输出。即fd[0]对应读端,fd[1]对应写端。

举例说明一下管道的用法:模拟client-server通信过程,父进程模拟client,子进程模拟server。server向client发送一个字符串,client接收到输出到屏幕。

 1 #include <unistd.h>
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 #include <sys/types.h>
 5 #include <errno.h>
 6 #include <string.h>
 7
 8 int main()
 9 {
10     int fd[2];
11     pid_t childpid;
12     char buf[100];
13
14     memset(buf,0,100);
15     //创建一个管道
16     if(pipe(fd) == -1)
17     {
18         perror("pipe() error");
19         exit(-1);
20     }
21     //创建一个子进程
22     childpid = fork();
23     if(childpid == 0)
24     {
25         printf("server input a message : ");
26         scanf("%s",buf);
27         //关闭读端
28         close(fd[0]);
29         write(fd[1],buf,strlen(buf));
30         exit(0);
31     }
32     if(childpid == -1)
33     {
34         perror("fork() error");
35         exit(-1);
36     }
37     //父进程关闭写端
38     close(fd[1]);
39     read(fd[0],buf,100);
40     printf("client read a message: %s\n",buf);
41     waitpid(childpid,NULL,0);
42     return 0;
43 }
复制代码

时间: 2025-01-14 14:31:54

管道和FIFO的相关文章

进程间通信 ---- 管道与FIFO 用法技巧

1.管道的创建 1.1 mkfifo(const char *pathname,mode_t mode); 函数已隐含指定O_CREAT|O_EXCL,所以它要么创建一个新的FIFO,要么返回EEXIST错误(已存在). 所以在创建已存在FIFO或新的FIFO,应该先调用mkfifo,并检查返回值 是否是EEXIST错误,若是EEXIST错误,则调      用open函数. 2.FIFO或管道读写 2.1对管道或FIFO的write 总是往末尾添加数据,对管道或FIFO的read总是从头开始读

第四章:管道与FIFO

4.1:概述 管道是最初的Unix IPC形式,可追溯到1973年的Unix第三版.尽管对于许多操作来说很有用,但它们的根本局限在于没有名字,从而只能由亲缘关系的进程使用.这一点随FIFO的加入得改正. 本章讲述管道和FIFO的创建与使用.我们使用一个简单的文件服务器例子,同时查看一些客户-服务器程序设计问题:IPC通道需要量.迭代服务器与并发服务器.字节流与消息接口. 4.2:一个简单的客户-服务器例子 下图所示的客户-服务器例子在本章和第六章中都要用,我们用它来分析说明管道.FIFO和Sys

第4章 管道与FIFO

4.1 概述 管道只在亲缘进程间使用,FIFO在任意进程间使用 4.2 管道 #include <unistd.h> int pipe(int fd[2]) fd[0]用来读管道,fd[1]用来写管道 1)命令who | sort | lp中的管道: 2)管道实现文件服务器与客户端: #include <unistd.h> #include <stdio.h> #include <fcntl.h> #include <string.h> #inc

进程间通信(一)——管道和FIFO

1. 概述 管道没有名字,适用于有亲缘关系的进程间. FIFO指first in first out,有一个路径名与之关联,从而允许无亲缘关系的进程间使用.亦称:命名管道named pipe. 两者都是单向数据流(半双工管道),具有随进程的持续性,数据都是先进先出,在进程间通信不需要某种形式的同步. 2.管道 #include <unistd.h> int pipe(int fd[2]): 返回:成功0,出错-1: 返回两个文件描述符:fd[0]打开来读,fd[1]打开来写. 典型使用: (1

Linux下进程间通信之命名管道(FIFO)

匿名管道的一个不足之处是没有名字,因此,只能用于具有亲缘关系的进程间通信.在命名管道(FIFO)提出后,该限制得到了克服.FIFO不同于pipe在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中.命名管道是一个设备文件,因此,即使进程与创建FIFO的进程不存在亲缘关系,只要可以访问该路径,就能够相互通信. FIFO总是按照先进先出的原则工作,第一个被写入的数据将首先从管道中读出. Linux下有两种方式创建FIFO,一是在shell下交互的建立一个命名管道,二是在程序中使用系统函

Linux环境编程之IPC进程间通信(四):管道和FIFO比较

系统加于管道和FIFO的唯一限制是: 1.OPEN_MAX 一个进程在任意时刻打开的最大描述符数.可以通过调用sysconf函数查询. 2.PIPE_BUF 可原子地写往一个管道或FIFO的最大数据量.Posix任务它是一个路径名变量,它的值可以随指定的路径名而变化,因为不同的路径名可以落在不同文件系统上,而这些文件系统可能有不同的特征.所以PIPE_BUF可通过pathconf函数取得. pipeconf.c #include <stdio.h> #include <stdlib.h&

Linux IPC之管道和FIFO

导言:管道是UNIX系统上最古老的IPC方法,管道提供了一种优雅的解决方案:给定两个运行不同程序的进程,在shell中如何让一个进程的输出作为另一个进程的输入?管道可以用来在相关(一个共同的祖先进程创建管道)进程之间传递数据.FIFO是管道概念的一个变体,它们之间的一个重要差别在于FIFO可以用于任意进程间的通信. 概述 每个shell用户都对在命令中使用管道比较熟悉,例如,统计一个目录中文件的数目: ls | wc -l 解释:为了执行上面的命令,shell创建了两个进程来分别执行ls和wc(

linux 进程间通信-有名管道(FIFO)

有名管道(FIFO) 命名管道也被称为FIFO文件,是一种特殊的文件.由于linux所有的事物都可以被视为文件,所以对命名管道的使用也就变得与文件操作非常统一. (1)创建命名管道 用如下两个函数中的其中一个,可以创建命名管道. #include <sys/types.h> #include <sys/stat.h> int mkfifo(const char *filename, mode_t mode); int mknod(const char *filename, mode

[转] IPC之管道、FIFO、socketpair

管道和FIFO作为最初的UNIX IPC形式,现在已用得较少.SocketPair可作为全双工版本的管道,较为常用,这里简单做个笔记 管道 * 只用于有亲缘关系的进程间通信 * 单向,即半双工 (双向方法:1 使用2个管道 2 使用SocketPair) * pipe() => write()/read() FIFO (有名管道) * 可用于无亲缘关系的进程间通信 * 单向 * mkfifo() => open() => write()/read() SocketPair * 套接字(一