[Linux程序设计笔记]第12章:管道
2011-11-08 10:19
183 查看
管道:完成两个进程间的通讯(数据流)。
如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函数。与操作普通文件相同。只是在阻塞的情况下会阻塞掉。
如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程序设计学习笔记----进程间通信——管道
- Linux程序设计笔记(第12章 POSIX线程)
- Linux 程序设计学习笔记----进程管理与程序开发(上)
- Linux程序设计-学习笔记-第一章
- linux程序设计--学习笔记
- Linux程序设计——进程间通信:管道
- Linux程序设计笔记-进程复制
- Linux笔记_进程通讯——管道
- linux程序设计笔记(1)
- Linux运维学习笔记之三:组合命令及命令分类、符号、管道 、工具集
- Linux程序设计笔记--IPC操作--semaphores
- Linux 程序设计学习笔记----进程管理与程序开发(下)
- 【ARM&Linux】学习笔记之管道
- Linux程序设计——管道
- linux 管道符号 | ,以及&& ||等等特殊符号笔记
- Linux程序设计第七章 内存管理 笔记
- GNU/Linux应用程序开发学习笔记(二)管道编程
- Linux学习笔记24——进程管道
- Linux程序设计学习笔记----多线程编程线程同步机制之互斥量(锁)与读写锁
- linux学习笔记之输出重定向管道符及通配符