营销型网站的名词解释,北京的制作网站的公司,湖南大型网站建设,广州开发公司1.进程间通信实现方式 【1】同一主机 linux下通信方式: a.传统的进程间通信方式 管道 --- 进行数据传输的管道 无名管道 有名管道 信号 --- b.system v 进程间通信 (posix 进程间通信) 共享内存 (进程间…1.进程间通信实现方式 【1】同一主机 linux下通信方式: a.传统的进程间通信方式 管道 --- 进行数据传输的管道 无名管道 有名管道 信号 --- b.system v 进程间通信 (posix 进程间通信) 共享内存 (进程间 效率最高的通信方式) 消息队列 信号量 【2】不同主机 socket --- 网络的方式实现 【3】进程间 实现 通信的 底层原理: 进程间空间独立 如果要实现进程间通信必须借助于内核 (内核也是在内存中运行的)
2.管道的定义特性及分类 【1】管道: 1. 有数据的入口(写端) 有数据的出口 (读端) 2. 数据从写端 流向 读端 3. FIFO --- first in first out 【2】 管道》无名管道、有名管道 无名管道 》pipe 》只能给有亲缘关系进程通信 有名管道 》fifo 》可以给任意单机进程通信(同一主机内) 【3】管道的特性 1、管道是 半双工的工作模式 2、所有的管道都是特殊的文件不支持定位操作。 lseek- fd fseek -FILE* 数据流 --- FIFO(first in first out) 3、管道是特殊文件读写使用文件IO。 fgets,fread,fgetc, open,read,write,close; 3. 流程 创建并打开管道 pipe函数 #include unistd.h int pipe(int pipefd[2]); int pipe(int *pipefd); int fd[2]; 功能创建并打开一个无名管道 参数pipefd[0] 无名管道的固定读端//0 -- 标准输入 pipefd[1] 无名管道的固定写端//1 -- 标准输出 返回值成功 0 失败 -1 有了文件描述符之后 可以读写操作 内核创建管道读写数据.
4.注意: 1.管道 是有大小 64k 字节 2.读写规则 读端存在 写管道 管道空 可以写 管道满 写操作阻塞 读端不存在写管道 会出现 管道破裂 SIGPIPE, Broken pipe --- 会杀死进程 写端存在 读管道 如果管道中有数据可以一直读 如果没有数据则读操作阻塞 写端不存在 读管道 如果管道中有数据可以一直读 如果没有数据则读操作不阻塞直接返回 3. 定位不能做 lseek 4. 无名管道只能用于亲缘关系进程间 (有继承关系)
写端不存在管内有数据 5.有名管道: 有名管道》fifo 》有文件名称的管道。 文件系统中可见
框架 (1).创建有名管道 -- 类似 文件 (管道文件) (2).打开有名管道 -- open (3).读写管道 -- read/write (4).关闭管道 》卸载有名管道 //close 1、创建mkfifo //创建了一个有名管道 #include sys/types.h #include sys/stat.h remove();
int mkfifo(const char *pathname, mode_t mode); 功能 在指定的pathname路径名称下创建一个权限为 mode的有名管道文件。 参数pathname要创建的有名管道路径名称 mode 8进制文件权限。 返回值成功 0 失败 -1
2、打开有名管道 open 注意 该函数使用的时候要注意打开方式 因为管道是半双工模式所有打开方式直接决定 当前进程的读写方式。 一般只有如下方式 int fd-read open(./fifo,O_RDONLY); fd 是固定读端 int fd-write open(./fifo,O_WRONLY); fd 是固定写端 不能是 O_RDWR 方式打开文件。 不能有 O_CREAT 选项因为创建管道有指定的mkfifo函数 双工 ---发送和接收可以同时进行 --手机电话 半双工 ---发送端 和 接收端 同一个时刻之后有一个起效 ---对讲机 单工 ---发送端 接收端固定 --- 广播 有名管道打开: 注意 如果一端是以只读或者只写方式打开的。 程序会阻塞 阻塞在打开操作。 直到另一端以只写或只读方式打开。 A.c --- 只读 B.c --- 只写 注意: 也可以以读写的方式打开此时不阻塞
3、管道的读写 文件IO 读 read(fd-read,buff,sizeof(buff)); 写 write(fd-write,buff,sizeof(buff));
4、关闭管道 close(fd)
5、卸载管道remove(); int unlink(const char *pathname); 功能将指定的pathname管道文件卸载同时 从文件系统中删除。 参数 ptahtname 要卸载的有名管道 返回值成功 0 失败 -1 创建有名管道两文件进行通信