LINUX学习笔记12——进程间通信1管道
2606 点击·0 回帖
![]() | ![]() | |
![]() | 1. 概述: 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) 管道一般由读数据的进程来创建和关闭。 | |
![]() | ![]() |