LINUX学习笔记12——进程间通信1管道
来源:岁月联盟
时间:2012-02-29
a) 为什么进程间通信:数据传输;资源共享;通知事件;进程控制;
b) 基础来源:
1. UNIX进程间通信:
2. 基于system v 进程间通信:
a) system v:UNIX操作系统接口的一个分支
3. Posix 进程间通信:
a) Posix:可移植操作系统接口
c) 分类:管道;信号;消息队列;共享内存;信号量;套接字
2. 管道通信:
a) 特点:
1. 单向,先进先出
2. 写入:在管道的尾部
3. 读:在管道的头部
b) 分类:
1. 无名管道:用于父进程和子进程间的通信
2. 有名管道:用于任意两个进程间的通信
c) 无名管道:
1. 创建管道:Int pipe(int filedis[2]);
a) Filedis[0]:用于读管道,文件描述符,创建管道后生成
b) Filedis[1]:用于写管道
c) 返回值:成功为0,失败为-1
d) #include <unistd.h>
2. 关闭管道:close(filedis[0]); close(filedis[1]);
3. 注意:
a) 必须在调用fork()之前调用pipe(),否则子进程将不会继承文件描述符
b) 创建子进程后需要把没用到的端口关掉。
c) 为了能够正常读写,读的进程需要先等待一段时间,让写的进程能够有时间写入数据。
4. 写入管道:write(filedis[1],”字符串”, sizeof(s));
5. 读取管道:read(filedes[0],buffer,80);
a) 把数据存在buffer数组中,80是buffer的长度
d) 有名管道:
1. 本质:是一个文件
2. 创建管道:Int mkfifo(const char * pathname, mode_t mode);
a) If((mkfifo(pathname,O_CREAT|O_EXCL)<0)&&(errno!=EEXIST))
b) pathname:文件名
c) mode:文件权限,一旦创建了就可用文件编程
d) 返回值:成功为0,失败为-1
e) #include<sys/types.h>
#include<sys/stat.h>
3. 关闭文件:unlink(const char * pathname);
4. 文件打开:Int open(const char *pathname, int flags, [mode])
a) Fd=open(pathname,O_RDONLY|O_NONBLOCK)
b) Pathname:需要完整的路径
c) 非阻塞标志:O_NONBLOCK
1. 没有使用:访问无法满足要求时进程将阻塞。
2. 使用:访问无法满足要求时进程不阻塞,立刻出错返回,errno 是ENXIO
5. 写入管道:write(fd, ”字符串”, sizeof(s));
6. 读取管道:read(fd, buffer,80);
a) 把数据存在buffer数组中,80是buffer的长度
b) 记得每次读数据前清空buffer里的内容memset(buffer, 0, 80), #include<string.h>
c) Buffer应该是字符串形式的
7. 注意:
a) 管道里的数据被读一次就没有了
b) 管道一般由读数据的进程来创建和关闭。