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\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()函数 (转载)

时间: 2025-01-06 15:53:20

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

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

进程间通信的机制--信号量.注意请不要把它与之前所说的信号混淆起来,信号与信号量是不同的两种事物.有关信号的更多内容,可以阅读我的另一篇文章:Linux进程间通信--使用信号.下面就进入信号量的讲解. 一.什么是信号量 为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域.临界区域是指执行数据更新的代码需要独占式地执行.而信号量就可以提供这样的一种访问机制,让一个临界区同一时间只有一个线程在

Linux 进程间通讯详解一

进程间的通讯 两台主机间的进程通讯 --socket 一台主机间的进程通讯 --管道(匿名管道,有名管道) --System V进程间通信(IPC)包括System V消息队列,System V信号量,System V共享内存 --socket 进程间共享内存的三种方式 --文件系统(通过系统调用读写磁盘文件,scoket)==>最慢 --Linux内核共享信息(直接在Linux内核中1进行通讯,比如管道,消息队列,信号)==>中等 --共享内存区(在自己进程内开辟一块内存,映射到系统内存)=

Linux 进程间通讯详解二

消息队列 --消息队列提供了本机上从一个进程向另外一个进程发送一块数据的方法 --每个数据块都被认为有一个类型,接收者进程接收的数据块可以有不同的类型值 --消息队列也有管道一样的不足,就是每个消息的最大长度是由上限的(MSGMAX),每个消息队列的总的字节数是有上限的(MSGMNB),系统上消息队列的总数也有一个上限(MSGMNI) 消息大小的三大限制 cat /proc/sys/kernel/msgmax --最大消息的长度限制(65536) cat /proc/sys/kernel/msg

进程间通讯-2(pipe)

通过pipe 管道的方式也可以实现进程间通信. 父进程和子进程之间可以实现相互通信. from multiprocessing import Process, Pipe def f(conn): conn.send([42, None, 'hello from child']) conn.send([42, None, 'hello from child2']) print('from parent:',conn.recv()) conn.close() if __name__ == '__ma

Linux 进程间通讯详解四

msgsnd函数 int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); --功能:把一条消息添加到消息队列中 --参数 msqid:由msgget函数返回的消息队列标识码 msgp:是一个指针,指针指向准备发送的消息 msgsz:是msgp指向的消息的长度,这个长度不含保存消息类型的那个long int长整型 msgflg:控制着当前消息队列满或到达系统上限时将要发生的事情 --成功返回0,失败返回-1并且设置err

linux_c开发(5-1)进程间通讯_进程间通讯概念

目的:为什么进程间需要通信? 1.数据传输 一个进程需要将他的数据发送给另外一个进程. 2.资源共享 多进程之间共享同样的资源. 3.通知事件 一个进程需要向另一个或一组进程发送消息,通知他们发生了某种事件. 4.进程控制 有些进程希望完全控制另一个进程的执行(eg:debug进程),此时控制进程希望能够拦截另一个进程的所有操作,并能够及时知道他的状态改变. 发展: linux进程间通讯(IPC)由以下及部分发展而来: 1.UNIX间进程通讯 2.基于system v进程间通讯 3.POSIX进

Android(IPC)进程间通讯1:详解Binder由来?

完整原文:http://tryenough.com/android-ipc1 Android开发的进程间通讯,整个Android的应用都依赖于binder做底层通信机制.而Linux中提供的进程间通讯方式并没有binder机制,那么android中为什么要单独创造这种通讯方式呢?带着这个问题,继续往下读. Linux中进程相关概念 Linux将系统内存划分成了 用户空间 和 内核空间 两部分: 用户空间 : 普通应用程序则运行在用户空间上,它们不能使用某些特定的系统功能,不能直接访问硬件,不能直

进程间通讯之有名管道

进程通信是指在进程间交换信息(传输数据).目前的计算机系统均提供了多任务并行环境,无论是应用程序还是系统程序,都需要针对每一个任务创建相应的进程. 每个进程之间都是相互独立的,不同的进程运行在各自不同的内存空间中,因此,进程之间的信息传递不可能通过变量或其他数据结构直接进行,只能通过进程间通讯完成. 进程间通讯方式:信号 .管道.信号量.消息队列.共享内存.Socket 今天介绍一下通过管道进行程序间的通讯.管道分为有名管道和无名管道. (管道文件)(半双工通讯:数据流向是单向的.) 有名管道:

ACE框架 基于共享内存的进程间通讯

ACE框架将基于共享内存的进程间通讯功能,如其它IO组件或IPC组件一样,设计成三个组件.流操作组件ACE_MEM_Stream,连接器组件ACE_MEM_Connector,以及接收连接组件ACE_MEM_Accpter.ACE框架为基于共享内存的进程间通讯提供了两种数据传输(分发deliver)策略.一种是使用生产者-消费者队列的一对多的多用户MT策略,另一种是使用socket流的可以使用反应器响应数据接收事件的Reactor策略.不论哪一种策略都要通过socket进行TCP连接,并进行进程