zoukankan      html  css  js  c++  java
  • Linux 进程间通讯方式 pipe()函数 (转载)

    转自:http://blog.csdn.net/ta893115871/article/details/7478779

     

    Linux 进程间通讯方式有以下几种:
    1-》管道(pipe)和有名管道(fifo).
    2-》消息队列
    3-》共享内存
    4-》信号量
    5-》信号(signal)
    6-》套接字(sicket)

    在这里我们看一下第一种====管道(pipe)。有名管道(fifo)见其它文章。

    eg :我们以前学的命令 cat  file | grep  "abc"  > file2
    在我看来 我们把cat 读取file中的内容读到内存在通过过滤命令grep 过滤出包含"abc"的记录 再输出重定向到文件file2
    在这个过程中 我们把cat  file | grep  "abc"的输出内容作为 > 的输入内容。

    在Linux系统中,管道通信可以通过使用系统调用来实现。
    使用格式为:
    #include<unistd.h>
    int  pipe(int fd[2]);
    功能: 创建一个简单的管道,若成功则为数组fd分配两个文件描述符,其中fd[0] 用于读取管道,fd[1]用于写入管道。
    返回:成功返回0,失败返回-1;

    管道,顾名思义,当我们希望将两个进程的数据连接起来的时候就可以使用它,从而将一个进程的输出数据作为另一个进程的输入数据达到

    通信交流的目的。
    但值得我们注意的是:管道它有自身的特点。
     (1)管道通信是单向的,并且遵守先进先出的原则,即先写入的数据先读出。
     (2)管道是一个无结构,无固定大小的字节流。
     (3) 管道把一个进程的标准输出和另一个进程的标准输入连接在一起。数据读出后就意味着从管道中移走了,消失了。其它的进程都不能   

               再读到这些数据。就像我们平常见到的管子水流走了就没有了。 这点很重要!!
      (4) pipe这种管道用于两个有亲缘关系的进程之间。eg:父子进程......

    好了,废话不多说了,下面我们看个例子:come on

    #include<stdio.h>
    #include<unistd.h>
    #include<stdlib.h>
    #include<string.h>
    #include<wait.h>
    #include<sys/types.h>

    int main(int argc ,char *argv[])
    {
     int pipefd[2],result;
     char buf[1024];
     int flag=0;
     pid_t pid;
     result= pipe(pipefd);//创建一个管道
     if(result==-1){
      perror("pipe error:");
      exit(EXIT_FAILURE);
     }
     pid=fork();//创建一个子进程
     if(pid==-1)
     {
      perror("fork  error:");
      exit(EXIT_FAILURE);
     }
     else if(pid==0){
      if((close(pipefd[1]))==-1)//close write only read
      {
       perror("close write  error:");
       exit(EXIT_FAILURE);
      }
      while(1){ //循环读取数据
       read(pipefd[0],buf,1024);//最多读取1024个字节
       printf("read from pipe :  %s ",buf);
       if(strcmp(buf,"exit")==0){// if 读取到的字符串是exit 这是
                        //父进程会接受到一个终止进程的信号,父进程会回收子进程的资                   // 源等
       exit(EXIT_SUCCESS);
       }   
      }    
     }else{
      //close read only write
      if((close(pipefd[0]))==-1){
       perror("close read error:");
       exit(EXIT_FAILURE);
      }
      while(1)//循环写入内容
      {
       waitpid(pid,NULL,WNOHANG);//等待子进程退出
       if(flag==1)
        exit(0);
       scanf("%s",buf);
       write(pipefd[1],buf,strlen(buf)+1);//具体写多少个字节
       if(strcmp(buf,"exit")==0){
        flag=1;
        sleep(1);//让子进程完全退出。
       }
      }

     }

     return 1;
    }

    此程序代码中都有注释,在这里就不废话了。
    运行结果为:

    当我们键入exit时 父子进程都退出。
    此时我们可以用ps -aux进行查看。

  • 相关阅读:
    VBA 声明 Option Explicit,让代码更规范
    VBA 声明 Option Explicit,让代码更规范
    VBA 静态变量 全局变量
    VBA 静态变量 全局变量
    VBA 设置单元格格式
    VBA 设置单元格格式
    正则表达式捕获性分组,非捕获性分组,前瞻,后瞻
    正则表达式捕获性分组,非捕获性分组,前瞻,后瞻
    vba 清除本sheet所有单元格内容和清除所有sheet中所有单元格
    vba 清除本sheet所有单元格内容和清除所有sheet中所有单元格
  • 原文地址:https://www.cnblogs.com/lance-ehf/p/3811667.html
Copyright © 2011-2022 走看看