linux匿名管道

进程通信

目的

数据传输:一个进程需要将它的数据发送给另一个进程

资源共享:多个进程之间共享同样的资源。

通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。

进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。

我们知道进程拥有独立的地址空间,如果想要进程间进行通信的话就必须让两者能够共享一段资源。管道就是这样一个共享资源,它是一个内存级别的文件,只是存在与内存当中,磁盘上不存在。下面直接介绍一个函数

#include <unistd.h>

功能:创建一无名管道

int pipe(int fd2);

参数

fd:文件描述符数组,其中fd0表示读端, fd1表示写端

返回值:成功返回0,失败返回错误代码

下面我们用图来解释一下上面的函数

首先我们每一个进程再调用pipe函数的时候都会产生通道,一个通道进行读,一个通道进行写,当我们创建子进程的时候,父子两个进程都有通向这一段资源的通道,这段资源就是我们说的管道,且父子进程都有读和写的权限,但是管道是一个单项的,里面的信息只能从一边流向另外一边,所以在通信的时候,如果一个进程想要对另外一个进程发消息,一个进程需要关掉读的通道,另外一个进程就必须关闭写的通道,这样才能保证数据是单向流动的。

cpp 复制代码
#include<iostream>
#include <unistd.h>


using namespace std;

int main()
{
    int fds[2]={0};                     //pipe中的参数是输出型的
    int n=pipe(fds);
    if(n!=0)
    {
        cerr<<"pipe error"<<endl;
        return 1;
    }
    pid_t id=fork();
    if(id<0)
    {
        cerr<<"fork error"<<endl;
        return 2;
    }
    else if(id==0)
    {
        //子进程
        close(fds[0]);            //关闭读通道
        int cnt=0;
        int total=0;
        while(true)
        {
            string message="hello world";
            total+=::write(fds[1],message,message.size());
            cnt++;
            cout<<"total:"<<total<<endl;
            sleep(2);
        }
    }
    else
    {
        //父进程
        close(fds[1]);
        char buffer[1024];
        while(true)
        {
            sleep(2);
            ssize_t n=::read(fds[0],buffer,1024);
            cout<<"message from child"<<buffer<<endl;
        }
    }

    return 0;
}

运行结果

在上面的程序当中,我们创建了两个进程,实现了子进程给父进程发消息的功能,但是有些地方我们需要注意,在上面的程序当中,出现了::,表示系统调用

1.当管道为空的时候,read系统调用会阻塞

2.当管道为满的时候,write系统调用会阻塞

3.当管道写端关闭,读端还是开启的时候,会读到0,表示文件末尾

4.写端正常,读端关闭,系统会杀死写进程

下面介绍一些匿名管道的特性

1.匿名管道长用于父子

2.单向数据通信

相关推荐
OpenPomeloxCommunity6 分钟前
Linux驱动基础(三):firmware的声明与加载
linux·操作系统
云计算练习生32 分钟前
什么是系统调用?为什么程序访问硬件必须经过它
linux·windows·操作系统·系统调用·操作系统原理
闲云野鹤在人间1 小时前
docker 入门 | 第7章 容器监控 和 第8章 容器日志 详解
运维·docker·容器·架构·云计算
亚川楼宇自控系统数据中心厂家1 小时前
IBMS 集成如何打通数据中心的子系统数据孤
运维
玄芯散人1 小时前
【筑基·059】Linux命令行入门:工程师的操作系统
linux·操作系统·命令行
半仙白桑1 小时前
内核篇第二讲:Linux exec 函数族详解
linux·linux驱动
AR-26710-1 小时前
Linux Day7——建组/用户、umask、Python脚本
linux·python
蓝速科技2 小时前
桌面双屏翻译机量产调试:三类场景兼容性破局方案丨蓝速科技
运维·数据库·人工智能·科技·技术分享
见闻小天地2 小时前
脱硫脱硝塔选变频器避坑指南:四方DL500变频器使用体验分享
大数据·运维·人工智能·业界资讯
吴声子夜歌2 小时前
Shell编程实例——内务及管理任务(一)
linux·运维·shell