Linux学习之系统编程篇:利用管道进行进程间通信
这里我们先补充一个小知识:
父子进程使用 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学习之系统编程篇:利用管道进行进程间通信相关推荐
- Linux学习之系统编程篇:管道设置为非阻塞及管道的读写行为
一.管道设置为非阻塞 管道默认读写两端都是堵塞属性,那么怎能才能设置成非阻塞呢? (1)设置读端非阻塞 获得原来的属性 flag: int flags = fcntl(fd[0], F_GETFL); ...
- Linux学习之系统编程篇:IPC 和管道的基本概念及管道的创建
一.IPC 概念 IPC: 进程间通信. 进程间通信的常见的 4 中方式: (1)管道 pipe fifo :最简单(但只能在有血缘关系下进行). (2)信号 signal : 属于系统的,所以系统开 ...
- Linux学习之系统编程篇:利用 SIGCHLD 回收子进程
子进程死亡会给父进程发送 SIGCHLD 信号!(默认动作:父进程忽略该信号)此时父进程就可以捕捉该信号,利用回调函数使用 waitpid 回收子进程. #include <stdio.h> ...
- Linux学习之系统编程篇:利用 setitimer 实现 alarm练习
#include <unistd.h> #include <stdio.h> #include <signal.h> #include <sys/time.h ...
- Linux学习之系统编程篇:利用 shm 进行进程间通信
一.写进程 shm_w.c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include ...
- Linux学习之系统编程篇:对线程的基本认识
(1)fork()后创建的子进程是父进程的拷贝,那么pthread_create,创建线程,创建的线程跟原进程有什么关系呢? fork 会通过拷贝产生新的虚拟地址空间(PCB 会变化),而 pthre ...
- Linux学习之系统编程篇:ps 和 kill 命令以及父子进程间数据共享模式
一.ps 和 kill 命令 1.ps 命令 常用方式: ps aux :查看正在运行进程信息(主要查 pid). ps ajx :更加详细(PID. PPID:父进程 id. PGID:进程组 id ...
- Linux学习之系统编程篇:编写一个守护进程
需求:写一个守护进程,每隔 2s 获取一次系统时间,将这个时间写入到磁盘文件 #include <stdio.h> #include <stdlib.h> #include & ...
- Linux学习之系统编程篇:守护进程(精灵进程、后台进程)
一.背景 一般情况下,启动终端(shell),系统会创建一个会话(shell 进程是会长),经过后续各种操作,该会话中会存在多个进程组,每个进程组中也会有多个进程(父进程是组长),若此时关闭 shel ...
最新文章
- apache bench linux,linux – 如何在CentOS上安装Apache Benchmark?
- 标题h和img优化的技巧
- [洛谷P2742]【模板】二维凸包([USACO5.1]圈奶牛Fencing the Cows)
- 三星和哈佛大学研究人员提出黑科技:拟用存储芯片“下载”复制人类大脑
- golang中的并发服务器
- 漫话:应用程序被拖慢?罪魁祸首竟然是Log4j!
- 华为轮值董事长郭平2020全联接大会主题演讲:永远面向阳光,阴影甩在身后
- python代码注释规范-Python编程规范之注释
- Psychology
- Java对象头与monitor
- 泰山游记:厕所竟然没水,可想而知
- atitit.http get post的原理以及框架实现java php
- [CCS] CCS的安装及配置
- android studio运行项目快捷键,Android Studio 快捷键大全
- java微信公众号授权登陆
- 储物点的距离【前缀和】
- NLP之语义自动匹配emoji
- Factorials
- goroutine和GPM调度
- html页面滚动 锚点,页面实现锚点滚动的滑动效果