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

Linux 管道替换标准输入输出 实现2个独立程序代码之间的通信

2012-04-08 15:48 686 查看
一、首先,向大家介绍Linux的一个概念:

标准输入(standard input)的文件描述符是 0

标准输出(standard output)是 1

标准错误(standard error)是 2

dup2是非常有用的调用,它的作用是用来复制一个文件的描述符。它们经常用来重定向进程的stdin、stdout和stderr。这个函数的 原形如下:

#include <unistd.h>

int dup2( int oldfd, int targetfd )

int execlp(const char * file,const char * arg,...,(char *)0);

  函数说明:

  execlp()会从PATH 环境变量所指的目录中查找符合参数file的文件名,找到后便执行该文件,然后将第二个以后的参数当做该文件的argv[0]、argv[1]……,最后一个参数必须用空指针(NULL)作结束。如果用常数0来表示一个空指针,则必须将它强制转换为一个字符指针,否则将它解释为整形参数。

二、现在我们来用fork创建一个进程,在子进程里用 execlp()函数 执行另一段代码,覆盖原有的数据空间。用管道来实现父子进程之间的通信;

子进程拥有读端,从管道读取数据,并将读端重定向为 屏幕输入。即 0

父进程拥有写端,往管道写入数据,并将写端重定向为屏幕输出。即 1

下面来看我们的代码:

/*********pipe_2********/

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

main()
{
int pipe_fd[2];
int a=2;
if(pipe(pipe_fd)<0)
{
printf("pipe creat ereo");
}
if(fork()==0)
{
close(0);		//子进程关闭 屏幕输入
dup2(pipe_fd[0],0);	//子进程将屏幕输入重定向为管道 读端
close(pipe_fd[1]);	//子进程不需要写端
execlp("pipe_1",NULL);	//执行新代码
}
else
{
close(1);		//父进程先暂时关闭屏幕输出端
dup2(pipe_fd[1],1);	//父进程将屏幕输出端重定向为管道输入端
close(pipe_fd[0]);	//父进程不需要读端
printf("%d",a);		//输出,即向管道写入 a=2;
}
}


/*******pipe_1*************/

#include<stdio.h>
#include<sys/types.h>
#include<fcntl.h>
main()
{
int num;
scanf("%d",&num);			//子进程从管道读取一个值
if(num==2)
creat("/root/test/pipe/MY_file",0644);	//创建一个文件证明 确实读到了 那个值
}


哈哈,虽说管道是 进程间通信的 最简单最简单的 工具,但是作用还是非常不小的哦,这样可以使程序在特定的时候执行特定的代码,而不用将代码整个写在一个文件里,话说模块性也更强大,可读性更高。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐