模拟实现ps aux | grep xxx使用管道通信的功能

思路:子进程中执行ps aux,通过匿名管道通信传输给父进程,父进程中输出内容即可
整体代码:
pipe1.c:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main(int argc,char *argv[] ){//创建一个匿名管道 pipeint pipefd[2];int ret= pipe(pipefd);if(ret==-1){perror("pipe:");exit(-1);}//创建一个子进程 forkpid_t pid =fork();if(pid==0){//child process ps auxclose(pipefd[0]);//stdout_fileno -> pipeint rett= dup2(pipefd[1],STDOUT_FILENO);if(rett == -1){perror ("dup2:");exit(-1);}//open ps aux and write pipe rett =execlp( "/bin/ps", "ps", "aux", NULL);if(rett == -1){perror("execl:");exit(-1);}close(pipefd[1]);}else if(pid > 0){//parent process read pipeclose(pipefd[1]);int rett= dup2(pipefd[0],STDIN_FILENO);if(rett == -1){perror ("dup2:");exit(-1);}rett =execlp("grep", "grep", argv[1] ,NULL);if(rett == -1){perror("execl:");exit(-1);}close(pipefd[0]);}else{perror("fork:");exit(-1);}return 0;
}

作业说明:
编译指令:gcc pipe1.c
运行指令:./a.out XXX (XXX不可少)
XXX可以是bash nginx等等
例如:

下面记录一下我遇到的问题:
1.管道的重定向,根据老师的提醒,我将子进程的[标准屏幕输出(写到屏幕上)STDOUT_FILEON] 指向[pipepf[1](写到管道里)],如图:

int rett= dup2(pipefd[1],STDOUT_FILENO);if(rett == -1){perror ("dup2:");exit(-1);}

但父进程依然按照老师的示例read以及printf,发现read:bad read报错终止,如下:

while (1){char buf[1024]={0};int retp= read(pipefd[0],buf,strlen(buf)-1);if(retp ==-1){perror("read:");exit(-1);}printf("%s",buf);}


后来想到将[标准读入(从键盘读入)]指向[从管道读入],问题方才解决,即:

int rett= dup2(pipefd[0],STDIN_FILENO);if(rett == -1){perror ("dup2:");exit(-1);}

2.子进程中执行ps aux,通过匿名管道通信传输给父进程,父进程中执行grep XXX,且输出内容,或者父进程生成两个子进程一个子进程执行ps aux,另一个子进程执行grep XXX,父进程可以回收子进程,这个已有其他的朋友写过,可参考,下面放链接:https://blog.csdn.net/zxy131072/article/details/89515930

模拟实现ps aux | grep xxx相关推荐

  1. linux命令ps -aux|grep xxx详解

    linux命令ps -aux|grep xxx详解 要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程, 而ps命令(Process Status)就是最基本同时也是非常强大 ...

  2. ps aux|grep xxx详解

    linux命令ps aux|grep xxx详解 要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程, 而ps命令(Process Status)就是最基本同时也是非常强大的 ...

  3. linux xxx命令,linux命令ps aux|grep xxx详解

    对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程, 而ps命令(Process Status)就是最基本同时也是非常强大的进程查看命令. 使用该命令 可以确定有哪些进程正在运 ...

  4. ps -aux | grep xxx, kill -s 9, pgrep --Linux下进程

    1. 可以用下面命令查看进程状态: ps -aux 只列出指定的进程: ps -aux | grep nmon 最常用的方法是ps -aux,然后再利用一个管道符号导向到grep去查找特定的进程,然后 ...

  5. linux命令 ps aux | grep xxx详解

    说明: 要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程, 而 ps命令 Process Status 就是最基本,同时也是非常强大的进程查看命令. 使用该命令 ,可以确定 ...

  6. linux命令ps aux|grep xxx

    要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程, 而ps命令(Process Status)就是最基本同时也是非常强大的进程查看命令. 使用该命令 可以确定有哪些进程正在 ...

  7. linux命令ps aux|grep xxx详解

    原文地址:https://www.cnblogs.com/robertoji/p/5555449.html 要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程, 而ps命令( ...

  8. linux aux是什么命令,linux命令ps aux|grep xxx详解

    要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程, 而ps命令(Process Status)就是最基本同时也是非常强大的进程查看命令. 使用该命令 可以确定有哪些进程正在 ...

  9. ps aux|grep xxx

    ps aux|grep tomcat ps:Process Status进程状态监控 -aux参数 -d:显示所有进程但是忽略会话引线 -a:显示一个终端的所有进程除了会话引线 -u:uid or u ...

最新文章

  1. No modifications are allowed to a locked ParameterMap
  2. 机械转电子工程嵌入式方向靠谱吗?怎么上手学习?
  3. pandas删除缺失数据(pd.dropna()方法)
  4. LNMP安装常见问题集锦(一)
  5. 【Android 逆向】Android 进程注入工具开发 ( 远程调用 | x86 架构的返回值获取 | arm 架构远程调用 )
  6. 想做“冲顶大会”?全球首套直播竞答解决方案来了!
  7. 文件 在线压缩 技术
  8. LintCode 402: Continuous Subarray Sum
  9. 项目优化经验——垃圾回收导致的性能问题
  10. linux环境生成weblogic密钥,Linux环境下创建weblogic服务.doc
  11. [Beego] [bootstrap-paginator]实现分页功能
  12. 当半个娱乐圈都在吃自嗨锅,方便面去哪儿了?
  13. 如何规划前端工程师职业发展路线?
  14. EasyTouch的使用
  15. springBoot的学习整理 摘抄蚂蚁课堂
  16. 基于蚁群算法的图像边缘检测
  17. 秃如其来第一步之安装JDK
  18. Tensorflow 神经网络模型架构
  19. 交换机的各种工作模式
  20. 百度图片推广广告位怎么做,图片广告位如何投放

热门文章

  1. ESP8266 RTOSSDK3.0 的工程同步到3.4
  2. K8S最新版本集群部署超详细(k8s版本1.5.1)docker 版本19.03.1以及基本操作和服务介绍。
  3. SitePoint播客#106:不要成为面巾纸
  4. 按键精灵_字符点阵制作
  5. mysql死锁的原因及解决方法_mysql死锁的原因及解决方法
  6. 文科生可报考那些计算机学校,文科生/600分以上可以报考哪些学校?
  7. 计算机软件与理论 算法,几种几何约束求解算法的分析-计算机软件与理论专业论文.docx...
  8. Javascript中公有成员,私有成员,静态成员
  9. android唱吧源码,Android版唱吧K歌王
  10. 后台获取前台传递参数为null和空字符串的区别,以及sql拼接之if判断