您的位置:首页 > 运维架构 > Linux

Linux 进程间通讯方式 pipe()函数 (转载)

2014-06-27 11:47 281 查看
转自: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进行查看。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: