进程间通信——管道

标签: 管道
15人阅读 评论(0) 收藏 举报
分类:

一、进程间通信
1、进程间通信的目的
* 数据传输:一个进程需要将他的数据发送给另一个进程
* 资源共享:多个进程之间共享同样的资源
* 通知事件:一个进程需要向另一个进程(组)发送消息,如子进程终止时要通知父进程
* 进程控制:有些进程希望完全控制另一个进程(如Debug),此时,控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道他的状态改变

2、进程间通信的分类
* 管道
匿名管道
命名管道
* System V IPC
System V IPC 消息队列
System V IPC 共享内存
System V IPC 信号量
* POSIXIPC
     消息队列
     共享内存
     信号量
     互斥量
     条件变量
     读写锁

二、管道     
1、管道是什么?
管道是进程间通信方式的一种,依赖于文件系统

2、管道的调用原理
* 通过fork()让父子共享文件,关闭都写端形成单向通信,进而让父子间通信

3、管道的特点:
* 匿名管道——亲缘关系(父子,兄弟)间通信
* 面向字节流
* 单向通信
* 自带同步机制
* 生命周期随进程
4、匿名管道与命名管道的区别
——匿名管道由pipe函数创建并打开
int pipe (int fd[2]);
fd:文件描述符数组
fd[0]:读端
fd[1]:写端
返回值:成功返回0,失败返回错误代码

——命名管道由mkfifo函数创建,打开用open
从命令行创建:$ mkfifo filename 创建管道文件
从程序里创建:int mkfifo(const char *filename, mode_t mode)
filename:文件名,可以指定路劲
mode:权限
返回值:成功返回0,失败返回-1
——FIFO(命名管道)与pipe(匿名管道)之间唯一的区别在他们打开的方式不同
三、匿名管道间通信
1、
子进程写,父进程读
先fork()出子进程,让父子进程文件共享,然后关闭子进程的读端和父进程的写端
这里写图片描述
这里写图片描述
运行结果:父进程收到了子进程发出的消息
这里写图片描述
2、管道读写的四种情况

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
3、管道是面向字节流的
写端快,读端慢,写端不停的写入消息,而读端5s后会一次性读取
这里写图片描述
这里写图片描述
这里写图片描述
四、命名管道

没有任何关系的进程间通信
这里写图片描述
下面是两个没有关系的进程间通信,采用命名管道

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

int main()
{
   if(mkfifo("./fifo",0644) < 0){
        perror("mkfifo");
        return 1;
   }
   int fd = open("./fifo", O_RDONLY);//read
   if(fd < 0){
        perror("open");
        return 2;
   }
   char buf[1024];
   while(1){
       // printf("Plase Enter: ");
       // fgets(buf, sizeof(buf), stdin);
        ssize_t s = read(fd, buf, sizeof(buf)-1);
        if(s > 0){
            buf[s] = 0;
            printf("baobao:>%s\n",buf);
        }else if(s==0){
            printf("baobao quit!\n");
            break;
        }else{
            perror("read");
        }
   }
   close(fd);
   return 0;
}
zhutou.c

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

int main()
{
   int fd = open("./fifo", O_WRONLY);//write
   if(fd < 0){
        perror("open");
        return 1;
   }
   char buf[1024];
   while(1){
        printf("Plase Enter: ");
        fgets(buf, sizeof(buf), stdin);
        write(fd, buf, strlen(buf));

   }
   close(fd);
   return 0;
}

这里写图片描述
这里写图片描述

查看评论

进程间通信之管道篇

何为进程间通信 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都是看不到的。所以进程之间如果要交换数据就必须通过内核。 在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核...
  • qq_33724710
  • qq_33724710
  • 2016-08-28 14:22:55
  • 808

进程间通信:管道及命名管道(代码实现)

管道:1.管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;             2.只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);             3...
  • wangiijing
  • wangiijing
  • 2016-07-07 21:03:31
  • 2800

进程间通信:管道(pipe)

管道的概述 管道也叫无名管道,它是是 UNIX 系统 IPC(进程间通信) 的最古老形式,所有的 UNIX 系统都支持这种通信机制。 无名管道有如下特点: 1、半双工...
  • lianghe_work
  • lianghe_work
  • 2015-08-16 23:19:43
  • 4706

【Linux】进程间通信之管道

每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数...
  • Scenlyf
  • Scenlyf
  • 2016-07-25 21:05:51
  • 1137

进程间通信方式总结——管道(一)

Linux/Unix系统IPC是各种进程间通信方式的统称,但是其中极少能在所有Linux/Unix系统实现中进行移植。随着POSIX和Open Group(X/Open)标准化的推进呵护影响的扩大...
  • tf_apologize
  • tf_apologize
  • 2017-04-13 16:28:47
  • 555

进程间的通信方式——pipe(管道)

详解进程间通信方式———管道;管道是如何实现进程间通信的;以及管道读取数据的四种方式,以及管道容量的大小。...
  • skyroben
  • skyroben
  • 2017-05-10 00:43:13
  • 7109

孙鑫vc++ 17 进程间通信(3) 命名管道

一、基础知识 1.命名管道 (1)命名管道是围绕Windows文件系统设计的一种机制,采用“‘命名管道文件系统’(Named Pipe File System,NPFS)“接口 (2)命名管道通...
  • wang_cong0214
  • wang_cong0214
  • 2013-01-07 13:51:49
  • 2928

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

前面我们学习了一下进程,我们知道多,进程间的地址空间相对独立。进程与进程间不能像线程间通过全局变量通信。 如果想进程间通信,就需要其他机制。          常用的进程间通信方式有这...
  • w616589292
  • w616589292
  • 2016-03-22 18:52:34
  • 2750

Python下的进程间通信-管道

背景:在python下利用subprocess模块实现进程间的通信。 使用subprocess包中的函数创建子进程的时候,要注意: 1) 在创建子进程之后,父进程是否暂停,并等待子进程运行。 2...
  • ljp1919
  • ljp1919
  • 2017-03-25 18:30:20
  • 1083

VC++环境下利用管道和线程实现进程间通信

VC++环境下利用管道和线程实现进程间通信
  • mynote
  • mynote
  • 2005-05-19 21:52:00
  • 2436
    个人资料
    等级:
    访问量: 2311
    积分: 298
    排名: 25万+
    文章分类