linux 进程学习笔记-进程pipe管道
所谓“进程间通信(IPC,inter-process communication)”,按照其目的讲就是让进程之间能够“共享数据”,“传输数据”,“事件通知”等,我所知道的一共有“管道” “信号” “消息队列(报文)” “共享内存” “套接字” 这几种方式。 这里先看看“管道” 可以将管道想象成生活中的水管,只不过其中流动的是“数据”。一个管道有两个“端”,一个称为“写端”,从这里将数据写入管道,另外一个称为“读端”,用于将数据从管道中读出。 管道分为非命名管道和命名管道两种,前者一般写成pipe,后者写作named pipe <!--[if !supportLists]-->Ÿ <!--[endif]-->pipe 由于其没有名字(或者说id之类的),所以其无法在两个毫无干系的两个进程间使用。试想一下,进程A创建了一个管道,进程B无法去找到该管道并使用它,因为没有任何可拿去查找的凭据,连名字都没有... 但在一种特殊情况下其是有用的,如下图,假设进程A创建了一个管道: 其中的箭头代表数据写入和读出,很明显,进程A可以从管道的写端将数据写入,然后再从读端读出,但这似乎没有什么意义。 但,如果在管道建立以后,我们将进程A进行一次fork(),有意思的事情发生了, 子进程会复制父进程的大部分信息,这些信息里当然包含了代表了管道读端和写端的两个“描述字”(但管道仍然只有一份,就像被两个进程读写的某个硬盘文件只有一份一样),所以其就演变成下图这个样子: 如果此时,我们将上图中左上角以及右下角的两个箭头抛弃掉: 这样,A和B之间就建立起了一个通信管道。 那么,将上述过程写成代码的形式就很简单了。 首先是 int pipe(int f[]),这个函数将创建一个未命名管道,并将管道的读端描述字包含在f[]中,将写端描述字放在f[]中,然后你就可以像利用普通文件描述字一样来读写数据了。 然后是fork函数,再次是int close(int fd) 函数,其用于关闭指定的文件描述字。 最后是write和read函数,用于读写数据。 #include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h> #define BUFF_SZ 256 int main()
{
printf("app start...\n"); pid_t pid;
int pipe_fd[];
char buf[BUFF_SZ];
const char data[] = "hi, this is the test data";
int bytes_read;
int bytes_write; //clear buffer, all bytes as 0
memset(buf, , sizeof(buf)); //creat pipe
if(pipe(pipe_fd) < )
{
printf("[ERROR] can not create pipe\n");
exit();
} //fork an new process
if( == (pid=fork()))
{
//close the write-point of pipe in child process
close(pipe_fd[]); //read bytes from read-point of pipe in child process
if((bytes_read = read(pipe_fd[], buf, BUFF_SZ)) > )
{
printf("%d bytes read from pipe : '%s'\n", bytes_read, buf);
} //close read-point of pipe in child process
close(pipe_fd[]);
exit();
} //close read-point of pipe in parent process
close(pipe_fd[]); //write bytes to write-point of pipe in parent process
if((bytes_write = write(pipe_fd[], data, strlen(data))))
{
printf("%d bytes wrote to pipe : '%s'\n", bytes_write, data);
} //close write-point of pipe in parent process
close(pipe_fd[]); //wait child process exit
waitpid(pid, NULL, ); printf("app end\n"); return ;
} 输出为:
app start...
bytes wrote to pipe : 'hi, this is the test data'
bytes read from pipe : 'hi, this is the test data'
app end
linux 进程学习笔记-进程pipe管道的更多相关文章
- linux 进程学习笔记-named pipe (FIFO)命名管道
与“无名管道”不同的是,FIFO拥有一个名称来标志它,所谓的名称实际上就是一个路径,比如“/tmp/my_fifo”,其对应到磁盘上的一个管道文件,如果我们用file命令来查看其文件类型的话,会得到如 ...
- linux 进程学习笔记-进程ID,PID
PID,进程号 , 范围在2~(??为什么需要这么多),而一个名为idle (或swapper)的进程占据的编号0,init进程占据了编号1. 进程0和进程1 : 系统启动时会从无到有地创建进程0,它 ...
- linux 进程学习笔记-进程跟踪
进程跟踪 long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data); Linux用ptrace来进行进 ...
- linux 进程学习笔记-进程信号sigal
信号(或软中断)是在软件层次上对中断的一个模拟,其运行在“用户空间”,一个进程对另外一个或几个进程通过发送信号来实现异步通信.当接收进程接收到信号后,其可以注册一下处理函数来说对这些信号进行处理(也可 ...
- linux c学习笔记----进程创建(fork,wait,waitpid)
1.pid_t fork(); (1)当一个进程调用了fork 以后,系统会创建一个子进程.这个子进程和父进程不同的地方只有他的进程ID 和父进程ID,其他的都是一样.就象符进程克隆(clone)自己 ...
- linux 进程学习笔记-进程退出/终止进程
<!--[if !supportLists]-->Ÿ <!--[endif]-->退出/终止进程 void _exit(int status) 与 void exit(int ...
- Linux内核学习笔记-2.进程管理
原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...
- Linux内核学习笔记二——进程
Linux内核学习笔记二——进程 一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器 ...
- 操作系统学习笔记----进程/线程模型----Coursera课程笔记
操作系统学习笔记----进程/线程模型----Coursera课程笔记 进程/线程模型 0. 概述 0.1 进程模型 多道程序设计 进程的概念.进程控制块 进程状态及转换.进程队列 进程控制----进 ...
随机推荐
- Java 实现对Sql语句解析
原文地址:http://www.cnblogs.com/zcftech/archive/2013/06/10/3131286.html 最近要实现一个简易的数据库系统,除了要考虑如何高效的存储和访问数 ...
- 用命令行执行ROBOT FRAMEWORK
除了在ride中执行用例,我们也可以通过命令行的形式执行用例. 1.执行一整个项目 pybot+项目路径 2.执行某个测试集 pybot+测试集的路径 3.执行某个测试集里面的某个用例 pybot - ...
- TextView上的文字逐渐变淡直到消失
给TextView加个动画效果,完了在个动画加个监听,里面有个动画执行完调用的方法在方法里面把TextView设置为gone,我觉得你直接加这个动画效果之后他就会不显示了,其实他还在那占有位置呢.想不 ...
- Lua学习七----------Lua函数
© 版权声明:本文为博主原创文章,转载请注明出处 1.Lua函数 - 完成指定的任务,这种情况下函数作为调用语句使用 - 计算并返回值,这种情况下函数作为赋值语句的表达式使用 - Lua函数可以返回多 ...
- HDU 3461 Code Lock(并查集的应用+高速幂)
* 65536kb,仅仅能开到1.76*10^7大小的数组. 而题目的N取到了10^7.我開始做的时候没注意,用了按秩合并,uset+rank达到了2*10^7所以MLE,所以貌似不能用按秩合并. 事 ...
- python windows package/module 安装
方法一: cmd中运行pip install xx 注意:1.pip添加至环境变量 2.系统自带这些安装模块 运行pip freeze > requirements.txt 可以在require ...
- unbuntu16.04上python开发环境搭建建议
unbuntu16.04上python开发环境搭建建议 2017-12-20 10:39:27 推荐列表: pycharm: 可以自行破解,但是不推荐,另外也不稳定 pydev+eclipse: ...
- JavaScript系列问题
JavaScript系列问题: 0.javascript 基础教程[温故而知新一] 1.通过JS变更页面字体的大小 2.图片压缩优化能有效提高网站浏览速度
- Makefile浅尝
[0]README makefile定义: 一个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要一先编译,哪些文件需要后编译,哪 ...
- 对你的 REST API 进行保护的正确办法
设计好一个美丽的 REST + JSON API 之后,怎样对你的 API 进行保护?在 Stormpath,我们花了 18 个月来寻找最佳实践.将其一一实践于 Stormpath API 中并分析其 ...