进程间通信(一)—管道

我会用几篇博客总结一下在Linux中进程之间通信的几种方法,我会把这个开头的摘要部分在这个系列的每篇博客中都打出来

进程之间通信的方式

  • 管道
  • 消息队列
  • 信号
  • 信号量
  • 共享存储区
  • 套接字(socket)

在以一切皆文件为原则的Linux系统中,管道也是一种文件(特殊文件),可以使用mkfifo命令创建一个管道文件

在管道文件的前面有一个p来标识管道文件

这次主要说的是通过管道完成进程之间的通信,通过管道通信有两种方式。

一种是匿名管道,一种是命名管道

  • 匿名管道


先来看一段代码

 1 #define MAXLINE 80
 2 int main()
 3 {
 4     int n;
 5     int fd[2];
 6     pid_t pid;
 7     char line[MAXLINE];
 8     if (pipe(fd) < 0)
 9         perror("pipe");
10     if ((pid = fork()) < 0)
11         perror("fork");
12     if (pid > 0)
13     {
14         //father
15         close(fd[0]);
16     }
17     else
18     {
19         close(fd[1]);
20         n = read(fd[0], line, MAXLINE);
21         write(stdout, line, n);//写到标准输出上看一下效果
22     }
23     return 0;
24
25 }

这个程序就是一个简单的父子进程之间通过管道进行通信的一个例子,具体的工作过程我用画图的方式展现出来

注意这一个步骤是十分重要的,如果不关闭相应的端口,就无法正确操作管道。

匿名管道主要利用了,创建子进程的时候会把父进程的文件描述符表拷贝一份这个特征,通过这个特征,父子进程就看到了一个公共的资源—管道,并同时拥有对该管道腹泻的权利,那么一方读,一方写,就可以完成进程之间的通信了。

所谓的匿名管道就是说,没有名字。。。你根本不知道这个管道文件存放在哪,也不知道这个管道文件的文件名,唯一跟这个跟管道文件有联系的只有父子进程中的文件描述符。那么根据匿名管道的实现机制,很容易就能看出他的优缺点。

  • 管道的n个特征
    • 管道是依赖于文件系统的,创建好管道之后,一定要关闭不使用的读写端
    • 只有父子进程才可以使用管道通信,也就是所谓的有血缘关系的进程进行进程间通信。(匿名管道独有)
    • 管道是基于数据流的,面向字节流!
    • 管道只能称之为单向数据通信,连半双工都算不上
    • 同步与互斥问题不需要考虑了,管道已经考虑了
    • 当父子进程退出的时候,管道的生命周期就结束了,也就是说管道的生命周期就是进程

上述就是匿名管道的使用和实现机制,可以看出必须有“亲缘关系”的进程之间才可以使用匿名管道来完成进程间通信。父子进程当然可以,“孙子”进程也是可以的~

那么为了解决只有有亲缘关系的进程才能使用这种方式进行通信的弊端,就有了命名管道的通信方式

  • 命名管道

简单的来说,我们刚才使用的匿名管道是因为不知道文件名和存放路径,所以只能通过继承文件描述符表来获得跟匿名管道建立联系的方式,如果我们知道路径和管道文件名呢?那不就可以完成非亲缘关系的进程间通信了么

时间: 2024-08-07 12:37:56

进程间通信(一)—管道的相关文章

进程间通信 之 管道

一 无名管道: 特点: 具有亲缘关系的进程间通信,但不仅仅指父子进程之间哦. (1)无名管道的创建 int pipe(int pipefd 参数: pipefd  数组的首地址 返回值: 成功返回0,失败返回-1 注意: 无名管道存在内核空间,创建成功会给用户空间两个文件描述符,fd[0]:读管道 fd[1]:写管道 思考:为什么无名管道只能用于亲缘关系间进程通信? 因为只有具有亲缘关系的进程存在数据拷贝 [拷贝文件描述符] 二.有名管道 特点: (1)任意进程间通信 (2)文件系统中存在文件名

【APUE】进程间通信之管道

管道是UNIX系统IPC最古老形式,并且所有UNIX系统都提供此种通信机制.管道由下面两种局限性: 1)历史上,它们是半双工的(即数据只能在一个方向上流动) 2)它们只能在具有公共祖先的进程之间使用.通常,一个管道由一个进程创建,然后该进程调用fork,此后父.子进程之间就可应用该管道 管道由调用pipe函数创建: #include <unistd.h> int pipe(int filedes[2]);//若成功则返回0,出错返回-1 注意:filedes[0]为读而打开,filedes[1

Linux的进程间通信 - 管道

Linux的进程间通信 - 管道 版权声明: 本文章内容在非商业使用前提下可无需授权任意转载.发布. 转载.发布请务必注明作者和其微博.微信公众号地址,以便读者询问问题和甄误反馈,共同进步. 微博ID:orroz 微信公众号:Linux系统技术 前言 管道是UNIX环境中历史最悠久的进程间通信方式.本文主要说明在Linux环境上如何使用管道.阅读本文可以帮你解决以下问题: 什么是管道和为什么要有管道? 管道怎么分类? 管道的实现是什么样的? 管道有多大? 管道的大小是不是可以调整?如何调整? 什

进程间通信之管道(pipe、fifo)

我们先来说说进程间通信(IPC)的一般目的,大概有数据传输.共享数据.通知事件.资源共享和进程控制等.但是我们知道,对于每一个进程来说这个进程看到属于它的一块内存资源,这块资源是它所独占的,所以进程之间的通信就会比较麻烦,原理就是需要让不同的进程间能够看到一份公共的资源.所以交换数据必须通过内核,在内核中开辟?块缓冲区,进程1把数据从?户空间 拷到内核缓冲区,进程2再从内核缓冲区把数据读?,内核提供的这种机制称为进程间通信.一般我们采用的进程间通信方式有 管道(pipe)和有名管道(FIFO)

【UNIX网络编程】进程间通信之管道

管道是最早的Unix进程间通信形式,它存在于全部的Unix实现中.关于管道,有例如以下几点须要知道: 1.它是半双工的,即数据仅仅能在一个方向上流动.虽然在某些Unix实现中管道能够是全双工的.但须要对系统进行某些设置.在Linux系统中,它是半双工的. 2.它没有名字.因此仅仅能在具有公共祖先的进程之间使用. 通经常使用在父子进程间.虽然这一点随着"有名管道FIFO"的增加得到改正了.但应该把它们看作是两种不同的进程间通信方式. 3.它由pipe函数创建,read和write函数訪问

Linux进程间通信之管道

1,进程间通信 (IPC ) Inter-Process Communication 比较好理解概念的就是进程间通信就是在不同进程之间传播或交换信息. 2,linux下IPC机制的分类:管道.信号.共享内存.消息队列.信号量.套接字 3,这篇主要说说管道:本质是文件,其他理论什么的网上已经有一大堆了,我就只写一点用法吧. 3.1 特点 1)管道是最古老的IPC,但目前很少使用     2)以文件做交互的媒介,管道分为有名管道和无名管道     3)历史上的管道通常是指半双工管道 3.2 管道:有

进程间通信之管道

管道(pipe)是进程间通信的一种方式,DEMO如下: #include <sys/types.h> #include <sys/wait.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #define MAXLINE 4096 int main(int argc, char **argv) { int n; int f

Linux进程间通信:管道

提到进程间通信,我们需要先了解一下进程是什么: 其实在Linux下,早期的Linux为了实现多个程序之间的交替操作,出现了进程的概念.为的就是维护操作系统整个的运行逻辑.并发就是进程间的交替执行. 进程是程序的动态实例. 进程并发运行的环境中,多个进程之间存在如下竞争和合作的关系: -          进程中的资源争用(间接作用) 当并发进程竞争使用同一个资源时,它们之间就会发生冲突.为了避免冲突,当一个进程获得资源时,另一个进程必须等待.这种情况需要通过互斥机制来解决. -         

Linux IPC(Inter-Process Communication,进程间通信)之管道学习

1.标准流管道 管道操作支持文件流模式,用来创建链接还有一个进程的管道,通过函数popen和pclose popen的详细介绍在本blog:Linux 多进程学习中有具体介绍 2.无名管道(PIPE) 特点: 1)仅仅能在亲缘关系进程间通信(父子或兄弟) 2)半双工(固定的读端和固定的写端) 3)是特殊文件,能够用read,write等,在内存中 管道函数原型: #include<unistd.h> int pipe(int fds[2]); 管道在程序中用一对文件描写叙述符表示,一个是可读属

进程间通信——命名管道

概念 管道一个不足之处是没有名字,因此只能用于具有亲缘关系的进程间通信,命名管道(named pipe或FIFO)解决了这一问题. FIFO提供一个路径名与之关联,以FIFO文件的形式存储于文件系统中.文件系统中路径名是全局的,各进程都可以访问,因此可以用文件系统中的路径名来标识一个IPC通道. 对文件系统来说,匿名管道(管道)是不可见的,它的作用仅限于在父进程和子进程两个进程间进行通信.而命名管道是一个可见的文件,因此,他可以用于任意两个进程间进行通信,不管这两个进程是不是父子进程,也不管这两