这里我们先补充一个小知识:
父子进程使用 pipe 进行通信时fork 和 pipe 先后的顺序是先 pipe,后 fork,因为父进程先创建管道,再 fork 创建子进程,这样才能是父子进程共享一块管道的读写操作符。
进行通信的代码如下:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{int pipefd[2]; // 先创建管道pipe(pipefd);int i;for(i = 0; i < 2; i++) { // 再创建2个子进程pid_t pid = fork();if(pid == 0) {break;}}if(i == 0) // 子进程1 实现 ps aux // 实现写入{close(pipefd[0]); // 关闭读端
// ps 会将结果输出至屏幕,即写到了标准输出,因此需要文件描述符重定向,写到管道写端(流入管道)dup2(pipefd[1], STDOUT_FILENO); execlp("ps", "ps", "aux", NULL);perror(“execlp”); // exec调用失败后作错误输出exit(1);}if(i == 1) // 子进程2 gerp // 实现读出{close(pipefd[1]); // 关闭写端dup2(pipefd[0], STDIN_FILENO); // grep是从标准输入读,文件描述符重定向,从管道读execlp("grep", "grep", "bash", NULL);
perror(“execlp”); // exec调用失败后作错误输出exit(1);}if(i == 2) // 父进程 回收子进程{close(pipefd[0]);close(pipefd[1]); // 关闭两端pid_t wpid;while( (wpid = waitpid(-1, NULL, WNOHANG) ) != -1 ){if( wpid == 0) continue;printf(“child died pid = %d\n”, wpid); }}return 0;
}

注:若父子间进行通信时,父进程实现 ps,子进程实现 grep时,父进程会使用 execlp 函数,父进程原码会被替换掉,无法回收子进程。

Linux学习之系统编程篇:利用管道进行进程间通信相关推荐

  1. Linux学习之系统编程篇:管道设置为非阻塞及管道的读写行为

    一.管道设置为非阻塞 管道默认读写两端都是堵塞属性,那么怎能才能设置成非阻塞呢? (1)设置读端非阻塞 获得原来的属性 flag: int flags = fcntl(fd[0], F_GETFL); ...

  2. Linux学习之系统编程篇:IPC 和管道的基本概念及管道的创建

    一.IPC 概念 IPC: 进程间通信. 进程间通信的常见的 4 中方式: (1)管道 pipe fifo :最简单(但只能在有血缘关系下进行). (2)信号 signal : 属于系统的,所以系统开 ...

  3. Linux学习之系统编程篇:利用 SIGCHLD 回收子进程

    子进程死亡会给父进程发送 SIGCHLD 信号!(默认动作:父进程忽略该信号)此时父进程就可以捕捉该信号,利用回调函数使用 waitpid 回收子进程. #include <stdio.h> ...

  4. Linux学习之系统编程篇:利用 setitimer 实现 alarm练习

    #include <unistd.h> #include <stdio.h> #include <signal.h> #include <sys/time.h ...

  5. Linux学习之系统编程篇:利用 shm 进行进程间通信

    一.写进程 shm_w.c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include ...

  6. Linux学习之系统编程篇:对线程的基本认识

    (1)fork()后创建的子进程是父进程的拷贝,那么pthread_create,创建线程,创建的线程跟原进程有什么关系呢? fork 会通过拷贝产生新的虚拟地址空间(PCB 会变化),而 pthre ...

  7. Linux学习之系统编程篇:ps 和 kill 命令以及父子进程间数据共享模式

    一.ps 和 kill 命令 1.ps 命令 常用方式: ps aux :查看正在运行进程信息(主要查 pid). ps ajx :更加详细(PID. PPID:父进程 id. PGID:进程组 id ...

  8. Linux学习之系统编程篇:编写一个守护进程

    需求:写一个守护进程,每隔 2s 获取一次系统时间,将这个时间写入到磁盘文件 #include <stdio.h> #include <stdlib.h> #include & ...

  9. Linux学习之系统编程篇:守护进程(精灵进程、后台进程)

    一.背景 一般情况下,启动终端(shell),系统会创建一个会话(shell 进程是会长),经过后续各种操作,该会话中会存在多个进程组,每个进程组中也会有多个进程(父进程是组长),若此时关闭 shel ...

最新文章

  1. apache bench linux,linux – 如何在CentOS上安装Apache Benchmark?
  2. 标题h和img优化的技巧
  3. [洛谷P2742]【模板】二维凸包([USACO5.1]圈奶牛Fencing the Cows)
  4. 三星和哈佛大学研究人员提出黑科技:拟用存储芯片“下载”复制人类大脑
  5. golang中的并发服务器
  6. 漫话:应用程序被拖慢?罪魁祸首竟然是Log4j!
  7. 华为轮值董事长郭平2020全联接大会主题演讲:永远面向阳光,阴影甩在身后
  8. python代码注释规范-Python编程规范之注释
  9. Psychology
  10. Java对象头与monitor
  11. 泰山游记:厕所竟然没水,可想而知
  12. atitit.http get post的原理以及框架实现java php
  13. [CCS] CCS的安装及配置
  14. android studio运行项目快捷键,Android Studio 快捷键大全
  15. java微信公众号授权登陆
  16. 储物点的距离【前缀和】
  17. NLP之语义自动匹配emoji
  18. Factorials
  19. goroutine和GPM调度
  20. html页面滚动 锚点,页面实现锚点滚动的滑动效果

热门文章

  1. ACL 2019 | 面向远程监督关系抽取的模式诊断技术
  2. 让聊天机器人同你聊得更带劲 - 对话策略学习 | 论文访谈间 #21
  3. java编程数据溢出问题_Java数据溢出代码详解
  4. 计算机网络是如何通信的【二】
  5. Lambda表达式详解【一】
  6. Vue-CLI——自定义title解决方案
  7. 设计模式(Design Pattern)
  8. android 设置 媒体服务器,第三讲:如何掌握媒体服务器的运行情况
  9. springboot使用Redis作缓存使用入门
  10. 最实用的logback讲解(2)—appender