1 / 115
文档名称:

进程间通信-IPC.ppt

格式:ppt   大小:1,245KB   页数:115页
下载后只包含 1 个 PPT 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

进程间通信-IPC.ppt

上传人:孔乙己 2022/8/31 文件大小:1.22 MB

下载得到文件列表

进程间通信-IPC.ppt

相关文档

文档介绍

文档介绍:进程间通信-IPC
匿名管道的建立
基本函数
int pipe(int fd[2]);
参数说明
fd[2]描述管道两端
fd[0]只能用于读,称为管道读端
fd[1]只能用于写,称为管道写端
若试图从写端读,或者向读端写都将导致错 return 0;
}
匿名管道----父子进程间通信
13
匿名管道操作基本流程
管道操作的基本流程:
1)使用pipe函数创建管道;
2)用fork函数创建一个子进程;
3)关闭父子进程中不需要的文件描述符,使用管道进行通信;
由于以上对管道的操作是比较规范,也比较常用。所以在ANSI C中将以上操作定义在两个标准库函数中,分别是popen和pclose函数。
FILE * popen(const char * command, const char * type) ;
int pclose(FILE * f p) ;
参数command是一个在shell中可以运行的命令字符串的指针;
参数type是一个字符指针,这个参数只有两种值,分别是r和w,分别对
应popen函数的返回值是一个读打开文件指针,还是写打开文件指针。
函数失败返回NULL,并设置出错变量errno。
pclose函数的参数fp是一个popen打开的文件描述符,函数失败时返回-1。
#include <>
#include <>
#include <>
#include <>
#include <>
#define BUFES PIPE_BUF
int main(void)
{
FILE *fp;
char *cmd = "ls -l";
char buf[BUFES];
if((fp = popen(cmd, "r")) == NULL)
{
perror("failed to open\n");
exit(1);
}
}
while((fgets(buf, BUFES, fp)) != NULL)
printf("%s\n", buf);
pclose(fp);
exit(0);
}
Popen示例
有名管道
匿名管道缺点
没有名字,只能用于具有亲缘关系的进程间通信
FIFO(有名管道)
严格遵循先进先出的读写规则
有名字,FIFO的名字包含在系统的目录树结构中,支持无亲缘关系的进程按名字访问
类似管道,在文件系统中不存在数据块,而是与一块内核缓冲区相关联
read和write操作也由pipe_read()和pipe_write() 实现
与匿名管道主要区别
FIFO索引节点出现在系统目录树上而不是pipefs特殊文件系统中
FIFO是一种双向通信管道,可以以读/写模式打开一个FIFO
16
有名管道的建立
基本函数
int mkfifo(const char * pathname, mode_t mode);
参数说明
pathname:创建的FIFO名字
mode:规定FIFO的读写权限
返回值
成功时返回0
失败时返回-1
若路径名存在,则返回EEXIST错误
说明
一般文件的I/O函数都可用于管道,如open(), close(), read(), write()等。
17
有名管道的open()
打开规则
为读操作而打开FIFO文件
若已有进程为写而打开该FIFO,则当前打开操作将成功返回
否则,可能阻塞直到有相应进程为写而打开该FIFO(当前打开操作设置未设置O_NONBLOCK标志)
或立即返回(当前打开操作设置O_NONBLOCK标志)
为写操作而打开FIFO文件
如果已经有进程为读而打开该FIFO,则当前打开操作将成功返回
否则,可能阻塞直到有相应进程为读而打开该FIFO(当前打开操作未设置O_NONBLOCK标志)
或者,返回ENXIO错误(当前打开操作设置O_NONBLOCK标志)
实例:
1,mkfifo testfifo 建立有名管道文件testfifo;
2,ls > testfifo 向有名管道文件写入”ls”命令显示的内容;
3,cat testfifo 用”cat”命令读取”testfifo”文件中的内容;
18
有名管道示例——创建有名管道
#include<sys/>
#include<sys/>
#incl