[Linux程序设计笔记]第12章:管道
来源:互联网 发布:mysql官方文档有问题 编辑:程序博客网 时间:2024/04/30 15:27
管道:完成两个进程间的通讯(数据流)。
如shell中的: cmd1 | cmd2
1. 程序与shell(或其他程序)之间通讯:[命令可以是启动其他进程的命令]
#include <stdio.h>
FILE * popen(const char * comand, const char *open_mode);
int pclose(FILE * stream_to_close);
popen将通过命令启动一个新的进程,并能对它发送的数据进行发送或接受。open_mode必须是r或w。
pclose将关闭与之关联的文件流,pclose调用只有在popen启动的进程结束之后才能返回。
文件流的操作用fread和fwrite来完成。
示例代码:
read_fp=popen("uname -a",r);
chars_read=fread(buffer,sizeof(char),BUFFERSZIE,read_fp);
2.匿名管道:
相关进程(特别是父子进程的)通讯。使用read和write进行读写操作。
#include<unistd>
int pipe(int file_descriptor[2]);
file_desciptor[0]为读取端,file_desciptor[1]为写入端。
示例代码:
int file_descriptor[2];
data_processed=write(file_descriptor[1],some_data,strlen(some_data));
data_porcessed=read(file_descriptor[0],some_data,strlen(some_data));
如果管道中没有数据可读,read返回0。
3.命名管道:FIFO文件(一种特殊的文件)
1.创建
shell中创建: mkfifo filename
程序中创建:
#include<sys/types.h>
#include<sys/stat.h>
int mkfifo(const char *filename,mode_t mode);
示例代码:
int res=mkfifo("/tmp/my_fifo",0777);
2.打开
程序只能以O_RDONLY、O_WRONLY和O_NONBLOCK打开。不能读写打开。单向通道。
如:
open(const char *path,O_RDONLY);
open(const char *path,O_RDONLY | O_NONBLOCK); //其实一般用阻塞比较好,这样可以实现进程的同步
open(const char *path,O_WRONLY);
open(cosnt char *path,O_WRONLY | O_NONBOLOCK);
阻塞的时候,read要等到有数据读才解除阻塞;非阻塞没有数据读时返回0;
阻塞的时候,write等到有读取进程启动后才继续执行。
FIFO文件的长度是一个很重要的因素,系统对任一时间一个FIFO文件里能保存的数据长度有限制。在limits.h
中,PIPE_BUF。
3.读写:read和write函数。与操作普通文件相同。只是在阻塞的情况下会阻塞掉。
- [Linux程序设计笔记]第12章:管道
- Linux程序设计笔记(第13章 进程间通信:管道)
- Linux程序设计笔记(第12章 POSIX线程)
- Linux程序设计笔记 第2章shell程序设计
- Linux程序设计笔记(第4章 Linux环境)
- Linux程序设计学习笔记----进程间通信——管道
- Linux程序设计笔记(第1章 入门)
- Linux程序设计笔记(第3章 文件操作)
- Linux程序设计笔记(第9章 开发工具)
- Linux程序设计笔记(第10章 调试)
- Linux程序设计笔记(第11章 进程和信号)
- Linux程序设计笔记(第15章 套接字)
- 《Linux程序设计》第4版 核心笔记
- Linux程序设计——管道
- 《Linux程序设计》--读书笔记---第十三章进程间通信:管道
- linux程序设计——进程管道(第十三章)
- linux程序设计——命名管道FIFO(第十三章)
- Linux程序设计第二章 shell程序设计 笔记
- Trufun家园二有关用例图的粒度和用例图原则讨论!--1
- IOS 未公开代码
- PHP学习笔记--PHP句法规则详解
- Android 应用程序分析之Settings
- oracle结果赋给SHELL变量
- [Linux程序设计笔记]第12章:管道
- 超线程基础
- 添加头文件小知识(小技巧)
- 大数据处理三大瓶颈:大容量、多格式和速度
- iphone开发-SQLite数据库使用
- 根据视频和平时所学知识,利用循环的嵌套编写了菱形与倒三角形。熟悉循环的嵌套
- java开源缓存框架和memcache分析
- android中,如何创建Frame Animation?
- sqlite 操作简明教程