进程间通信——管道

一、进程间通信
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;
}

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

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页