zoukankan      html  css  js  c++  java
  • linux之无名管道

    1、查看命令: man 2 pipe

    2.头文件:#include <unistd.h>

    3、函数原型: int pipe(int pipefd[2]);
    a、pipefd[2] :无名管道的两个文件描述符,int型的数组,大小为2,pipefd[0]为读端,pipefd[1]为写端

    4、返回值:
    成功:返回0
    失败:返回-1

    5、函数特点:
    无名管道是最简单的常用于一对一的亲缘进程间通信的方式,既然说是管道,所以可以想象成一条水管,连接两个进程
    一个进程负责输入数据,另一个进程负责接收数据,反过来也一样。

    6、无名管道的缺点:
    a、没有名字,因此无法使用open()打开
    b、只能用于亲缘进程间(如父子进程、兄弟进程、祖孙进程等)通信
    c、半双工工作方式,读写端是分开的,pipefd[0]为读端,pipefd[1]为写端
    d、写入操作不具有原子性,因此只能用于一对一的简单通信
    e、不能用lseek()来定位

    这是演示代码:
    #include<stdio.h>
    #include<unistd.h>
    #include<errno.h>
    #include<stdlib.h>
    #include<wait.h>
    #include<string.h>
    
    #define LENGTH 50  //字符数组的大小
    int main(int argc,char **argv)
    {
        int status;//进程退出时用
        int pipefd[2];//用于保存无名管道的两个文件描述符,pipefd[0]为读端,pipefd[1]为写端
        
        int ret;
        pid_t pid;
        
        /*创建无名管道,需要在fork()之前创建,这样子进程才能继承无名管道*/
        ret = pipe(pipefd);
        if(ret == -1)//创建失败
        {
            perror("pipe");
            exit(1);//异常退出
        }
        
        pid = fork();//创建子进程
        
        if(pid != 0)//父进程,负责从无名管道中读取数据
        {
              wait(&status);//等待子进程退出
              char buf[LENGTH];
              read(pipefd[0],buf,sizeof(buf));//从无名管道中读取数据,read函数会阻塞
              printf("来自子进程的信息: %s",buf);
            
        }
        
        
        if(pid == 0)//子进程,负责把数据写入无名管道
        {
               char buf[LENGTH];
               bzero(buf,sizeof(buf));//清空缓冲区
               puts("请输入你要发送给父进程的内容:");
               fgets(buf,sizeof(buf),stdin);
               write(pipefd[1],buf,sizeof(buf));//把数据写入无名管道
               exit(0);//子进程退出
        }
        
        close(pipefd[0]);//关闭无名管道中的读端
        close(pipefd[1]);//关闭无名管道中的写端
        return 0;
    }
    鉴于本人才疏学浅,所以其中不免有遗漏或者错误,恳请各位博友批评指正。
  • 相关阅读:
    3D开发基础知识和简单示例
    六大设计原则详解
    InnoSetup 根据选择的安装语言显示不同语言的(协议)License和更新说明
    ASP.NET Core如何在.NET Core中构建和运行时禁用浏览器启动
    DevExpress 设置DateEdit显示年月季度
    DevExpress设置单元格不可编辑,选单元格则选中一行
    sql server数据库只有mdf文件,没有ldf,如何加载
    .net core 整洁架构入门
    在ASP.NET Core使用Entity Framework Core的日志显示sql语句
    在ASP.NET Core使用Entity Framework Core的日志
  • 原文地址:https://www.cnblogs.com/wurenzhong/p/7290498.html
Copyright © 2011-2022 走看看