[Linux程序设计笔记]第12章:管道

来源:互联网 发布:mysql官方文档有问题 编辑:程序博客网 时间:2024/04/30 15:27
 

管道:完成两个进程间的通讯(数据流)。
      如shell中的: cmd1 | cmd2

1. 程序与shell(或其他程序)之间通讯:[命令可以是启动其他进程的命令]
     #include <stdio.h>
     FILE * popen(const char * comand, const char *open_mode);
     int    pclose(FILE * stream_to_close);
    
     popen将通过命令启动一个新的进程,并能对它发送的数据进行发送或接受。open_mode必须是r或w。
     pclose将关闭与之关联的文件流,pclose调用只有在popen启动的进程结束之后才能返回。
     文件流的操作用fread和fwrite来完成。
     
        示例代码:
           read_fp=popen("uname -a",r);
           chars_read=fread(buffer,sizeof(char),BUFFERSZIE,read_fp);

2.匿名管道:
    相关进程(特别是父子进程的)通讯。使用read和write进行读写操作。
    #include<unistd>
    int pipe(int file_descriptor[2]);
  
    file_desciptor[0]为读取端,file_desciptor[1]为写入端。
       
         示例代码:
             int file_descriptor[2];
             data_processed=write(file_descriptor[1],some_data,strlen(some_data));
             data_porcessed=read(file_descriptor[0],some_data,strlen(some_data));
     如果管道中没有数据可读,read返回0。

3.命名管道:FIFO文件(一种特殊的文件)
    1.创建
      shell中创建: mkfifo filename
       程序中创建:
       #include<sys/types.h>
       #include<sys/stat.h>
       int mkfifo(const char *filename,mode_t mode);
      
       示例代码:
           int res=mkfifo("/tmp/my_fifo",0777);
    
     2.打开
         程序只能以O_RDONLY、O_WRONLY和O_NONBLOCK打开。不能读写打开。单向通道。
         如:
            open(const char *path,O_RDONLY);
            open(const char *path,O_RDONLY | O_NONBLOCK); //其实一般用阻塞比较好,这样可以实现进程的同步
            open(const char *path,O_WRONLY);
            open(cosnt char *path,O_WRONLY | O_NONBOLOCK);
         阻塞的时候,read要等到有数据读才解除阻塞;非阻塞没有数据读时返回0;
         阻塞的时候,write等到有读取进程启动后才继续执行。
         FIFO文件的长度是一个很重要的因素,系统对任一时间一个FIFO文件里能保存的数据长度有限制。在limits.h
         中,PIPE_BUF。
 
      3.读写:read和write函数。与操作普通文件相同。只是在阻塞的情况下会阻塞掉。
            
      
        

原创粉丝点击