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********/
/*******pipe_1*************/
哈哈,虽说管道是 进程间通信的 最简单最简单的 工具,但是作用还是非常不小的哦,这样可以使程序在特定的时候执行特定的代码,而不用将代码整个写在一个文件里,话说模块性也更强大,可读性更高。
标准输入(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); //创建一个文件证明 确实读到了 那个值 }
哈哈,虽说管道是 进程间通信的 最简单最简单的 工具,但是作用还是非常不小的哦,这样可以使程序在特定的时候执行特定的代码,而不用将代码整个写在一个文件里,话说模块性也更强大,可读性更高。
相关文章推荐
- linux中利用有名管道实现进程之间的通信
- Linux进程间通信:管道(把管道用作标准输入和标准输出)
- Linux常用指令别名、输入/输出重定向、管道、命令连接符、命令替换符
- 短期快速学习LINUX,涉及vi用法,管道,标准输入、输出和错误,grep 用法
- 输入2个数,并且标准输出2个数之间的书
- python调用外部子进程,通过管道实现异步标准输入和输出的交互
- python调用外部子进程,通过管道实现异步标准输入和输出
- Python使用管道(pipe)协同标准输入输出流使程序通信
- 【Linux常用指令整理8】别名、输入/输出重定向、管道、命令连接符、命令替换符
- linux程序设计——把管道用作标准输入和输出(第十三章)
- Linux下的有名管道(05)---使用两个管道实现两个进程之间的通信(对讲机模式)
- Linux下管道通信实现A进程死循环输出A后被C进程处理输出C
- Linux - 标准输入转换为标准输出 代码(C)
- python调用外部子进程,通过管道实现异步标准输入和输出的交互
- Linux - 标准输入转换为标准输出 代码(C)
- copy()作为标准输入设备和标准输出设备之间的数据筛检程序
- Linux初学,利用管道文件进行通信,实现3个人之间的群聊
- Linux下的有名管道(06)---使用两个管道实现两个进程之间的通信(手机模式)
- [剑指offer][面试题04]实现一个函数,将字符串中的空格替换为“ ”.例如输入“we are happy.”,输出"we are happy.".
- 编写代码实现,模拟用户登录情景,并且只能登录三次。 只允许输入三次密码,如果密码正确则提示登录成,如果三次均输入错误,则退出程序。