Linux程序设计:管道

进程间通信:管道

  • 什么是管道:  当从一个进程链接数据流到另一个ie进程时,我们使用术语管道。
    • shell负责标准输入和标准输出
  • 进程管道
    • 传递数据的方法使用popen和pclose函数
    • 代码示例
    • #include<stdio.h>
      
      FILE *popen(const char *command,const char *open_mode);
      int pclose(FILE *stream_to_close); 
      
  • 将输出送往popen
    • 传递跟更多的数据
    • 如何实现popen
    • 
      #include<unistd.h>
      #include<stdlib.h>
      #include<string.h>
      #include<stdio.h>
      
      int main(){
         FILE *read_fp ;
         char buffer[BUFSIZ +1] ;
         int chars_read ;
         memset(buffer,'\0',sizeof(buffer));
         read_fp = popen("uname -a ","r");
      
         if(read_fp !=NULL){
           chars_read = fread(buffer,sizeof(char),BUFSIZ,read_fp);
           if(chars_read > 0){
             printf("output  was : \n %s \n",buffer);
           }
           pclose(read_fp);
           exit(EXIT_SUCCESS);
         }
      
         exit(EXIT_FAILURE);
      
      }
      
      
      #include<unistd.h>
      #include<stdlib.h>
      #include<string.h>
      #include<stdio.h>
      
      int main(){
         FILE *write_fp ;
         char buffer[BUFSIZ +1] ;
         sprintf(buffer,"once upon a time ,there was ...");
         write_fp = popen("od -a ","w");
      
         if(write_fp !=NULL){
           fwrite(buffer,sizeof(char),strlen(buffer),write_fp);
           pclose(write_fp);
           exit(EXIT_SUCCESS);
         }
      
         exit(EXIT_FAILURE);
      
      }
      
      #include<unistd.h>
      #include<stdlib.h>
      #include<string.h>
      #include<stdio.h>
      
      int main(){
         FILE *read_fp ;
         char buffer[BUFSIZ +1] ;
         int chars_read ;
         memset(buffer,'\0',sizeof(buffer));
         read_fp = popen("ps ax","r");
      
         if(read_fp !=NULL){
           chars_read = fread(buffer,sizeof(char),BUFSIZ,read_fp);
           while(chars_read > 0){
             buffer[chars_read -1] = '\0' ;
             printf("output  was : \n %s \n",buffer);
             chars_read = fread(buffer,sizeof(char),BUFSIZ,read_fp);
           }
           pclose(read_fp);
           exit(EXIT_SUCCESS);
         }
      
         exit(EXIT_FAILURE);
      
      }
      

  • pipe调用
    • pipe函数原型
  • 命名管道:FIFO
    • 在不相关直接交换数据,需要命名管道
    • 创建管道命名
    • #include<unistd.h>
      #include<stdlib.h>
      #include<stdio.h>
      #include<sys/types.h>
      #include<sys/stat.h>
      
      int main(){
      
          int res = mkfifo("/tmp/my_fifo",0777);
          if(res ==0){
              printf("FIFO created \n");
          }
          
         exit(EXIT_SUCCESS);
      }

    • ls  -lF  /tmp/my_fifo     第一个字符是P开头就表示是管道
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<sys/types.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<string.h>

#define FIFO_NAME  "/tmp/my_fifo"

int main(int argc,char *argv[]){

    int res  ;
    int open_mode =0 ;
    int i; 

    if(argc<2){
       fprintf(stderr,"Usage: %s < some combination  of O_RDONLY O_WRONLY  O_NONBLOCK > \n",*argv);
       exit(EXIT_FAILURE);
    }
     
    for ( i = 1; i < argc; i++)
    {
        if(strncmp(*++argv,"O_RDONLY",8)== 0){
            open_mode |= O_RDONLY ; 
        }

          if(strncmp(*argv,"O_WRONLY",8) == 0){
            open_mode |= O_WRONLY ; 
        }

          if(strncmp(*argv,"O_NONBLOCK",10) == 0){
            open_mode |= O_NONBLOCK ; 
        }
    }
   
    if(access(FIFO_NAME,F_OK) == -1){ 
       if(res !=0){
          printf("cound not create fifo . %s \n",FIFO_NAME);
          exit(EXIT_FAILURE);
       } 
    }

    printf("Process %d  opening FIFO \n",getpid());
    res = open(FIFO_NAME,open_mode);
    printf("Process %d result %d \n",getpid(),res);
    sleep(5);
    if(res ==-1){
         (void)close(res);
    }
    printf("Process %d finished \n",getpid());
    exit(EXIT_SUCCESS);
}
  • 客户/服务框架架构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值