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

一、首先,向大家介绍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);	//创建一个文件证明 确实读到了 那个值
}

哈哈,虽说管道是 进程间通信的 最简单最简单的 工具,但是作用还是非常不小的哦,这样可以使程序在特定的时候执行特定的代码,而不用将代码整个写在一个文件里,话说模块性也更强大,可读性更高。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值