重定向 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模型的更多相关文章

  1. Asp.Net MVC 的19个管道事件

    httpApplication调用ProcessRequest方法,内部执行19个管道事件,如下 BeginRequest  开始处理请求 AuthenticateRequest 授权验证请求开始,获 ...

  2. 管道与popen函数与重定向

    转自:http://www.tldp.org/LDP/lpg/node12.html Pipes the Easy Way! LIBRARY FUNCTION: popen(); PROTOTYPE: ...

  3. 进程同步控制(锁,信号量,事件), 进程通讯(队列和管道,生产者消费者模型) 数据共享(进程池和mutiprocess.Pool模块)

    参考博客 https://www.cnblogs.com/xiao987334176/p/9025072.html#autoid-1-1-0 进程同步(multiprocess.Lock.Semaph ...

  4. 命令行环境下简单实用的工具——重定向&管道

    如果你对管道和重定向应用自如了,无需继续往下看.本文虽然以windows上cmd命令行环境演示,但同样适用于Unix/Linux等平台. 引言 关于管道和重定向,最初是在刘汝佳的<算法竞赛入门经 ...

  5. Shell基础:常用技巧&重定向&管道操作

    Shell脚本介绍和常用工具 Shell脚本 Shell脚本:实际就是windows里的批处理脚本,多条可一次执行的Shell命令集合.Linux上的脚本可以用很多种语言实现,bash shell是比 ...

  6. Python 3 利用 Dlib 19.7 和 sklearn机器学习模型 实现人脸微笑检测

    0.引言  利用机器学习的方法训练微笑检测模型,给一张人脸照片,判断是否微笑:   使用的数据集中69张没笑脸,65张有笑脸,训练结果识别精度在95%附近: 效果: 图1 示例效果 工程利用pytho ...

  7. 进程间通信(队列、管道)、消费者模型和进程池(apply,apply_async,map)

    一.队列(先进先出) 进程间通信:IPC(Inter-Process Communication) 队列是使用管道和锁定实现,所以Queue是多进程安全的队列,使用Queue可以实现多进程之间的数据传 ...

  8. Python和其他进程的管道通信方式--popen和popen2的比较

    目前有一个查询程序 get_user_id 是用C写的,python需要调用这个程序:使用 get_user_id  "用户名" 可以得到输出: "ID0002451&q ...

  9. 基于共享内存、信号、命名管道和Select模型实现聊天窗口

    问题模型 A.B两个进程通过管道通信,A 进程每次接收到的数据通过共享内存传递给A1进程显示,同理,B进程每次接收到的数据通过共享内存传递给B1进程显示: 对于A.B 进程,采用ctrl+c(实际为S ...

随机推荐

  1. Android DOM解析XML示例程序

    DOM方式解析xml是先把xml文档都读到内存中,然后再用DOM API来访问树形结构,并获取数据的.DOM比较符合人的思维模式,但是其对内存的消耗比较大. activity_main.xml < ...

  2. Qt5的cmake文件位置

    D:\APICenter\Qt\Qt5.8.0\5.8\msvc2015\lib\cmake\Qt5\Qt5Config.cmake

  3. C语言的基本构成

    C语言的基本构成 知识点:C语言的注释:关键字:书写风格:常量和变量 重要程度:★★★★ 1.C语言的良好风格 用C语言编写的程序,称为C语言源程序,简称C程序. 本节将通过一个简单的C程序例子,向大 ...

  4. 【IOS6.0 自学瞎折腾】(五)应用程序的启动过程和Application生命周期

    一 :main函数入口 看下项目资源结构,其实程序的入口也是在main.m里面. #import <UIKit/UIKit.h> #import "BvinAppDelegate ...

  5. JZOJ.5331【NOIP2017模拟8.23】壕游戏

    Description

  6. 4.querystring属性

    1.querystring.stringify(obj[, sep[, eq[, options]]]) 序列化, 第二个参数分隔符, 第三个参数是对象分隔符 querystring.stringif ...

  7. postgresql模式创建、修改、删除

    一个数据库包含一个或多个模式,而模式又包含表.序列.函数等,不同的模式可以包含相同名称的表.序列.函数等.模式本质上是命名空间,就像人的姓氏一样.一个用户只要有权限,连接到数据库后,可一次访问该数据库 ...

  8. Git之删除仓库

    Github删除已有仓库步骤 在仓库页面点击设置 在新打开网页删除 输入仓库名点击删除即可

  9. pta 习题集 5-15 数组循环左移

    本题要求实现一个对数组进行循环左移的简单函数:一个数组aa中存有nn(>0>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向左移mm(≥0≥0)个位置,即将aa中的数据由(a0a ...

  10. X-UA-Compatible也无法解决的IE11兼容问题

    3月8日接到一位用户的电话,说写博客时编辑器显示不出来.浏览器用的是披着360外衣的IE11,编辑器用的是CuteEditor. 当时电脑上没安装IE11,用IE10测试正常,心想应该是一个手到擒来的 ...