转自: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\n",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进行查看。

Linux 进程间通讯方式 pipe()函数 (转载)的更多相关文章

  1. Linux 进程间通讯

    一.Linux 下进程间通讯方式 1)管道(Pipe)及有名管道(named pipe): 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允 ...

  2. 鸿蒙内核源码分析(进程通讯篇) | 九种进程间通讯方式速揽 | 百篇博客分析OpenHarmony源码 | v28.03

    百篇博客系列篇.本篇为: v28.xx 鸿蒙内核源码分析(进程通讯篇) | 九种进程间通讯方式速揽 | 51.c.h .o 进程通讯相关篇为: v26.xx 鸿蒙内核源码分析(自旋锁篇) | 自旋锁当 ...

  3. Android 进程间通讯方式

    Android 进程间通讯方式 1.通过单向数据管道传递数据 管道(使用PipedWriter/ 创建PipedReader)是java.io包的一部分.也就是说,它们是一般的Java功能,而不是An ...

  4. Linux进程间通讯的几种方式的特点和优缺点,和适用场合

    http://blog.csdn.net/jeffcjl/article/details/5523569 由于不同的进程运行在各自不同的内存空间中.一方对于变量的修改另一方是无法感知的.因此.进程之间 ...

  5. linux进程间通讯的几种方式的特点和优缺点

    # 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系.# 有名管道 (named pipe) : 有名管道也是 ...

  6. Linux 进程间通讯详解一

    进程间的通讯 两台主机间的进程通讯 --socket 一台主机间的进程通讯 --管道(匿名管道,有名管道) --System V进程间通信(IPC)包括System V消息队列,System V信号量 ...

  7. Linux 进程间通讯详解二

    消息队列 --消息队列提供了本机上从一个进程向另外一个进程发送一块数据的方法 --每个数据块都被认为有一个类型,接收者进程接收的数据块可以有不同的类型值 --消息队列也有管道一样的不足,就是每个消息的 ...

  8. linux进程间通讯-System V IPC 信号量

    进程间通信的机制--信号量.注意请不要把它与之前所说的信号混淆起来,信号与信号量是不同的两种事物.有关信号的很多其它内容,能够阅读我的还有一篇文章:Linux进程间通信--使用信号.以下就进入信号量的 ...

  9. 进程间通讯-2(pipe)

    通过pipe 管道的方式也可以实现进程间通信. 父进程和子进程之间可以实现相互通信. from multiprocessing import Process, Pipe def f(conn): co ...

随机推荐

  1. java 通过反射机制调用某个类的方法

    package net.xsoftlab.baike; import java.lang.reflect.Method; public class TestReflect {     public s ...

  2. MySQL最优配置文件模板·2016-11-28

    小伙伴们大爱的MySQL最优配置文件模板更新啦.对之前的MySQL最优配置文件·20160901做了一些修正,更为名至实归.可以通过此链接进行下载.当然,更欢迎同学们提出意见和建议,共同打造一个最优M ...

  3. bzoj 1430 小猴打架 prufer 性质

    小猴打架 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 709  Solved: 512[Submit][Status][Discuss] Descri ...

  4. [NOIP2007] 提高组 洛谷P1098 字符串的展开

    题目描述 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或者“4-8”的字串,我们就把它当作一种简写,输出时,用连续递增的字母获数 ...

  5. codevs2597 团伙

    题目描述 Description 1920年的芝加哥,出现了一群强盗.如果两个强盗遇上了,那么他们要么是朋友,要么是敌人.而且有一点是肯定的,就是: 我朋友的朋友是我的朋友: 我敌人的敌人也是我的朋友 ...

  6. Apache 使用localhost(127.0.0.1)可以访问,使用本机IP(局域网)不能访问

    本机ip是:192.168.1.25,输入后提示: Forbidden You don't have permission to access / on this server 对于此问题的解决办法, ...

  7. java.lang.RuntimeException: JPedal Trial has now expired

    具体提示: java.lang.RuntimeException: JPedal Trial has now expired jpedal-server-trial.jar jar包过期了,jpeda ...

  8. MongoDB小结24 - 索引简介2

    索引的名字 集合中每个索引都有一个字符串类型的名字,来唯一标识索引. 服务器通过名字来操作或者删除索引. 要注意的是,索引名有字符个数限制,所以索引创建时一定要用自定义的名字,如 db.user.en ...

  9. 网络学习之OSI七层协议和TCP协议

    OSI七层简单介绍 应用层:提供操作系统和应用程序的接口 表示层:表示数据如何加密.如何压缩的 会话层:将不同应用程序数据分离 传输层:提供可靠和不可靠的数据传输和重传.纠错的功能 网络层:提供IP地 ...

  10. android账号与同步之账号管理

    在android提供的sdk中,samples文件夹下有一个叫SampleSyncAdapter的演示样例,它是一个账号与同步的实例,比方Google原始的android手机能够使用Google账号进 ...