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);

}

 

转载于:https://www.cnblogs.com/gd-luojialin/p/9216010.html

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值