zoukankan      html  css  js  c++  java
  • Linux-管道(day09)

     目录

    一、使用C程序访问环境变量

    二、文件输入重定向

    三、管道

    四、信号


    三、管道

    管道分为:无名管道和有名管道。

    1、无名管道

      使用pipe(2)可创建无名管道

    #include<unistd.h>

    int pipe(int pipefd[2]);

    功能:

      创建可用于进程间通信的单向管道

    参数:

      pipefd[2]:

        pipefd[0]:读端

        pipefd[1]:写端

    返回值:

      成功:0

      错误:-1,errno被设置

    思路:

      (1)父进程创建管道

      (2)fork(2)创建子进程

      (3)父进程关闭写端、子进程关闭读端

      (4)子进程写,父进程读

    注意:

      无名管道中需要使用到文件描述符,所以,无名管道应用于具有亲缘关系(父子,兄弟)的进程通信

    #include<stdio.h>
    #inlcude<unistd.h>
    #include<sys/typs.h>
    #include<sys/wait.h>
    #include<string.h>
    #include<stdlib.h>
    int main(void){
        pid_t pid;
        char msg[]="this is a test";
        char buf[128];
        int fd[2];
        //创建子进程
        pid=fork();
        //创建管道
        int r =pipe(fd);
        if(r==-1){
            perror("pipe");
            return 2;
        }
        if(pid==-1){
            perror("fork");
            return 1;
        }
        if(pid==0){
            close(fd[0]);//关闭读端
            write(fd[1],msg,strlen(msg));//写入管道
            exit(0);
        }else{
           close(fd[1]);
            int rt=read(fd[0],buf,128);
            write(1,buf,rt);
            wait(NULL);
        }
       
        return 0;  
    }

     2、有名管道

      有名管道的实质是创建一个管道问价你,一个向文件写数据,一个向文件读数据。

      创建有名管道可以使用函数mkfifo(3)

    #include<sys/types.h>

    #include<sys/stat.h>

    int mkfifo(const char *pathname,mode_t mode);

    功能:

      创建一个特殊的FIFO文件,文件名字为pathname,mode指定了文件的权限(mask&~umask)

    参数:

      pathname:管道文件的名字

      mode:管道文件的权限

    返回值:

      成功:0

      失败:-1,errno被设置

    有名管道通信,下面为进程A的代码

    #include<stdio.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    #include<string.h>
    #include<fcntl.h>
    #include<unistd.h>
    int main(int argc,char *argv){
        char *msg[]="hello world
    ";
        //创建管道文件
        int m=mkfifo(argv[1],0664);
        if(m==-1){
            perror("mkfifo");
            return 1;
        }
        //打开管道文件
        int fd=open(argv[1],O_RDWR);  
        if(fd==-1){
            perror("open");
            return 2;
        }
        write(fd,msg,strlen(msg)+1 );
        close(fd);
        return 0;
    }

    下面为进程B的代码

    #include<stdio.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    #include<string.h>
    #include<fcntl.h>
    #include<unistd.h>
    int main(int argc,char *argv){
        char buf[128];
        int fd= open(argv[1],O_RDONLY);
        if(fd==-1){
            perror("open");
            return 1;
        }
        //从管道文件读取数据
        int r = read(fd,buf,128);
        write(1,buf,r)
        
        close(fd);
        return 0;
    }
  • 相关阅读:
    使用contentProvider
    创建Sqlite数据库(一)
    AIDL实现进程间通信
    Messenger实现进程间通信(IPC)
    Serializable使用
    Parcelable使用(二)
    STAR法则
    Python系列-------基本语法
    前端随心记---------面试题集
    前端随心记---------惟客科技面试
  • 原文地址:https://www.cnblogs.com/ptfe/p/11011343.html
Copyright © 2011-2022 走看看