管道:完成两个进程间的通讯(数据流)。
如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之间的通信、匿名管道和命名管道(FIFO文件)。探讨了每种管道的创建、打开及读写操作方法,并提供了具体的示例代码。
689

被折叠的 条评论
为什么被折叠?



