19重定向管道与popen模型
重定向 dup2
int dup(int fd)
重定向文件描述符 int newFd = dup(STDOUT_FILENO)
newFd 指向 stdout
int dup2(int fd1, int fd2)
重定向文件描述符 dup2(newFd, STDOUT_FILENO)
stdout 指向 newFd
重定向输入输出到管道
例子1: 父进程标准输入后,有子进程进行标准输出
void testDup()
{
int fds[2];
pid_t pid;
char buf[128];
if(pipe(fds))
{
printf("file:%s,line:%d",__FILE__,__LINE__);
perror("fail pipe!");
return ;
}
pid=fork();
if(pid<0)
{
printf("file:%s,line:%d",__FILE__,__LINE__);
perror("fail fork!");
return ;
}
else if(pid==0)
{
close(fds[1]);
//直接输出
dup2(STDOUT_FILENO,fds[0]);
}
else
{
close(fds[0]);
dup2(STDIN_FILENO,fds[1]);
//父进程接受键盘输入
while(1)
{
fprintf(stderr,"parent send:");
memset(buf,0,sizeof(buf));
read(STDIN_FILENO,buf,sizeof(buf));
write(fds[1],buf,strlen(buf));
}
close(fds[1]);
}
return ;
}
例子2: ls | more 类似实现
思路:
1.ls 的输出,是输出到 STDOUT
2.more 的输入,是从 STDIN 接受
3.我们要实现 ls 的输出,作为 more 的输入
4.所以我们要创建管道,然后,把 STDOUT 和 STDIN 重定向到管道
5.这样 我们就实现了: 连接 ls 和 more

void testDup2()
{
int fds[2];
pid_t pid;
if(pipe(fds))
{
printf("file:%s,line:%d",__FILE__,__LINE__);
perror("fail pipe!");
return ;
}
pid=fork();
if(pid<0)
{
printf("file:%s,line:%d",__FILE__,__LINE__);
perror("fail fork!");
return ;
}
else if(pid==0)
{
close(fds[1]);
dup2(fds[0],STDIN_FILENO);
printf("\n");
execlp("more","more","-d",NULL);
close(fds[0]);
}
else
{
close(fds[0]);
dup2(fds[1],STDOUT_FILENO);
execlp("ls","ls","-b",NULL);
close(fds[1]);
}
}
popen 模型
FILE *popen(const char *cmd, char *type)
解析:
创建子进程,并调用exec,指向cmd命令
同时建立管道,用于父子进程标准输入输出
type取值 “ r ” : 数据由子进程流到父进程
type取值 “ w ”: 数据由父进程流到子进程
int pclose(FILE *stream)
popen第一参数与exec的区别:
popen第一参数包括了命令的名称,参数。如:popen(”ps -ef”,”r”)作为第一参数。
exec是路径、名称、参数分开多个部分作为exec的参数传入。如exec(“ps”,”ps”,”-ef”);
例子:排序
void testPopen()
{
int arr[]={2,4,5,77,11,22,633,21,4};
FILE *file=popen("sort -n","w");
if(!file)
{
printf("file:%s,line:%d",__FILE__,__LINE__);
perror("fail open file!");
return ;
}
int i=0;
for(;i<sizeof(arr)/sizeof(arr[0]);++i)
{
fprintf(file,"%d\n",arr[i]);
}
pclose(file);
}
例子2:通过 popen 实现 ps -ef | grep pts
思路:
1.使用popen模型分别调用ps –ef, grep pts:
pRead = popen("ps -ef", "r")
pWrite= popen("grep pts", "w")
2.此时pRead,pWrite就是两个文件指针,进行文件读写操作。
3. 从 pRead中读取数据,写入到 pWrite中。
void testPopen2()
{
FILE *pRead=popen("ps -ef","r");
FILE *pWrite=popen("grep pts","w");
if(!(pRead&&pWrite))
{
printf("file:%s,line:%d",__FILE__,__LINE__);
perror("fail open file!");
return ;
}
char buf[1024];
while(fgets(buf,sizeof(buf),pRead))
{
fputs(buf,pWrite);
}
pclose(pRead);
pclose(pWrite);
}
19重定向管道与popen模型的更多相关文章
- Asp.Net MVC 的19个管道事件
httpApplication调用ProcessRequest方法,内部执行19个管道事件,如下 BeginRequest 开始处理请求 AuthenticateRequest 授权验证请求开始,获 ...
- 管道与popen函数与重定向
转自:http://www.tldp.org/LDP/lpg/node12.html Pipes the Easy Way! LIBRARY FUNCTION: popen(); PROTOTYPE: ...
- 进程同步控制(锁,信号量,事件), 进程通讯(队列和管道,生产者消费者模型) 数据共享(进程池和mutiprocess.Pool模块)
参考博客 https://www.cnblogs.com/xiao987334176/p/9025072.html#autoid-1-1-0 进程同步(multiprocess.Lock.Semaph ...
- 命令行环境下简单实用的工具——重定向&管道
如果你对管道和重定向应用自如了,无需继续往下看.本文虽然以windows上cmd命令行环境演示,但同样适用于Unix/Linux等平台. 引言 关于管道和重定向,最初是在刘汝佳的<算法竞赛入门经 ...
- Shell基础:常用技巧&重定向&管道操作
Shell脚本介绍和常用工具 Shell脚本 Shell脚本:实际就是windows里的批处理脚本,多条可一次执行的Shell命令集合.Linux上的脚本可以用很多种语言实现,bash shell是比 ...
- Python 3 利用 Dlib 19.7 和 sklearn机器学习模型 实现人脸微笑检测
0.引言 利用机器学习的方法训练微笑检测模型,给一张人脸照片,判断是否微笑: 使用的数据集中69张没笑脸,65张有笑脸,训练结果识别精度在95%附近: 效果: 图1 示例效果 工程利用pytho ...
- 进程间通信(队列、管道)、消费者模型和进程池(apply,apply_async,map)
一.队列(先进先出) 进程间通信:IPC(Inter-Process Communication) 队列是使用管道和锁定实现,所以Queue是多进程安全的队列,使用Queue可以实现多进程之间的数据传 ...
- Python和其他进程的管道通信方式--popen和popen2的比较
目前有一个查询程序 get_user_id 是用C写的,python需要调用这个程序:使用 get_user_id "用户名" 可以得到输出: "ID0002451&q ...
- 基于共享内存、信号、命名管道和Select模型实现聊天窗口
问题模型 A.B两个进程通过管道通信,A 进程每次接收到的数据通过共享内存传递给A1进程显示,同理,B进程每次接收到的数据通过共享内存传递给B1进程显示: 对于A.B 进程,采用ctrl+c(实际为S ...
随机推荐
- Linux 防火墙:Netfilter
一.Netfilter 简介 (1) Netfilter 是 Linux 内置的一种防火墙机制,我们一般也称之为数据包过滤机制,而 iptables 只是操作 netfilter 的一个命令行工具(2 ...
- isdigit()
isdigit() 是字符串的一个方法,用来判断这个字符串是否是纯数字的字符串 In [1]: str = 'hello' In [2]: str.isdigit() Out[2]: False In ...
- win10下安装Oracle 11g 32位客户端遇到INS-13001环境不满足最低要求
在以管理员身份运行setup.exe之后,出现了:[INS-13001]环境不满足最低要求,通过网上搜索之后找到了解决途径 首先,打开你的解压后的database文件夹,找到stage,然后cvu,找 ...
- ReactNative For Android 项目实战总结
版权声明:本文由王少鸣原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/159 来源:腾云阁 https://www.qclo ...
- (分解质因数模板)求 1~r 内与 n 互素的元素个数
void Solve(LL n){ ///分解质因数保存结果于p p.clear(); ; i*i<=n; i++) ){ p.push_back(i); ) n/=i; } ) p.push_ ...
- go练习5--生成md5
import "crypto/md5" import "encoding/hex" //go 生成 md5 func T4_1() { m := md5.New ...
- ScrollView 设置滚动是否可用
extends:http://stackoverflow.com/questions/5763304/disable-scrollview-programmatically , http://stac ...
- thinkphp---定义前台视图模板
具体可以参考: http://document.thinkphp.cn/manual_3_2.html#template_define 方法一:在入口文件中定义 // 定义模板路径 define(&q ...
- 【MySQL】为什么不要问我DB极限QPS/TPS
为什么不要问我DB极限QPS/TPS 背景 相信很多开发都会有这个疑问,DB到底可以支撑多大的业务量,如何去评估?对于这个很专业的问题,DBA也没有办法直接告诉你,更多的都是靠经验提供一个看似靠谱的结 ...
- 使用 Capistrano 进行自动化部署
最近在折腾这个,弄了好多次都不成功,看了官方文档和很多博客,都没有说清楚,因此,我觉得有必要把它记录下来,以帮助更多像我这样被弄得烦躁的人. 首先是安装,其实 Ubuntu 上面安装 Capistra ...