大气的企业网站源码,河南安阳市地图,网站建设与管理的网页,网站后台登陆密码目录
1.pipe管道读写行为
1.1例题#xff1a;实现父子进程 ls | wc -l
1.2兄弟进程 ls | wc -l
2.管道缓存区
2.1命令查询
2.2函数查询
3.pipe管道的优劣
4.命名管道 fifo
5.mmap
5.1文件进程间通信
5.2建立、释放映射区
5.3匿名映射
6.进程间通信
6.1父子进间通…目录
1.pipe管道读写行为
1.1例题实现父子进程 ls | wc -l
1.2兄弟进程 ls | wc -l
2.管道缓存区
2.1命令查询
2.2函数查询
3.pipe管道的优劣
4.命名管道 fifo
5.mmap
5.1文件进程间通信
5.2建立、释放映射区
5.3匿名映射
6.进程间通信
6.1父子进间通信
6.2无血缘关系进程间通信 1.pipe管道读写行为
- 读管道 1. 管道有数据 read返回实际读到的字节数。 2. 管道无数据1无写端read 返回 0 类似读到文件末尾 2有写端阻塞等待。
- 写管道 1. 无读端异常终止。 ( SIGPIPE 信号) 2. 有读端1管道已满阻塞等待。 2管道未满返回实际写出的字节数。
1.1例题实现父子进程 ls | wc -l
父进程执行 ls 命令并将其输出写入管道子进程执行 wc -l 并从管道读取输入
int main(int argc, char *argv[])
{pid_t pid;int fd[2];// 先创建pipepipe(fd);pid fork(); // ls | wc -lif (pid 0) { // 子进程 实现 wc -lclose(fd[1]); // 子进程读管道,关闭写端.dup2(fd[0], STDIN_FILENO); // 让 wc 从管道的读端,读数据.execlp(wc, wc, -l, NULL);} else if (pid 0) {close(fd[0]); // 父进程写管道,关闭读端.dup2(fd[1], STDOUT_FILENO);// 将 写出到 屏幕的ls 结果,写入到 管道写端.execlp(ls, ls, NULL);}return 0;
} 1.2兄弟进程 ls | wc -l
int main(int argc, char *argv[])
{int fd[2], i 0;pid_t pid;pipe(fd);for (i 0; i 2; i)if ((pid fork()) 0) {break;}if (i 0) { // 兄 lsclose(fd[0]);dup2(fd[1], STDOUT_FILENO);execlp(ls, ls, NULL);} else if (i 1) { // 弟 wc -lclose(fd[1]);dup2(fd[0], STDIN_FILENO);execlp(wc, wc,-l,NULL);} else { // 父close(fd[0]);// 父进程不参与管道使用应该关闭写端、读端。保证管道内部数据单向流动。close(fd[1]);for (i 0; i2; i)wait(NULL);}return 0;
}
2.管道缓存区
2.1命令查询 2.2函数查询 long fpathconf(int fd, int name); 参1 传 fd[0]/fd[1] 都可以 参2 传 _PC_PIPE_BUF 宏 3.pipe管道的优劣
- 优点简单。比信号、套接字、mmap 简单很多 - 缺点 1. 只能单向通信实现双向通信需要两个管道。 2. 只能应用于父子、兄弟...(有公共祖先)进程间。无血缘关系进程间后来用 fifo 替代。
4.命名管道 fifo
- 命令创建mkfifo 管道名
- 函数创建 //可以用于无血缘关系进程间通信 int mkfifo(const char *pathname, mode_t mode); —— 演示代码fifo_w.c fifo_r.c - 管道中的数据一次性读取读走没。 - 读端以 O_RDONLY 打开 fifo 管道。 - 写端以 O_WRONLY/O_RDWR 打开同一个 fifo 管道。
5.mmap
5.1文件进程间通信
- 有血缘关系、无血缘关系的进程都可以使用同一个文件来实现进间通信。
5.2建立、释放映射区
- mmap 借助文件映射创建共享内存映射区 #include sys/mman.h void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); 参数 addr指定映射区的首地址。通常传NULL表示让系统自动分配 length共享内存映射区的大小。文件的实际大小。 prot共享内存映射区的读写属性。PROT_READ、PROT_WRITE、PROT_READ|PROT_WRITE flags标注共享内存映射区的共享属性 MAP_SHARED 对共享内存所做的修改会反应到物理磁盘文件上。 IPC专用 MAP_PRIVATE对共享内存所做的修改不会反应到物理磁盘文件上。 fd: 用来创建共享内存映射区的那个文件的 文件描述符。 offset默认0表示映射文件全部偏移位置。必须是4k整数倍。 返回值 成功映射区的首地址。 失败MAP_FAILED (void *(-1)), errno - munmap 释放共享内存映射 int munmap(void *addr, size_t length); 参1mmap() 函数的返回值。 参2共享内存映射区大小 返回值 成功0 失败-1, errno mmap使用的注意事项
1. 用于创建映射区的文件的大小必须是非0。映射区的大小 文件大小。 2. 创建映射区需要read权限。指定访问权限为 MAP_SHARED mmap需要读写权限。 应该 文件打开权限。只写不行 3. 文件描述符fd 在mmap创建映射区完成可以立即关闭后续访问文件使用 内存地址。 4. offset 必须是 4096 的整数倍。MMU映射的最小单位 4k 5. 映射区访问的权限设为 MAP_PRIVATE 对内存做的所有修改都只在内存有效不反应的磁盘上。不能应用于 IPC
mmap函数保险调用方式
1. fd open(“文件名”O_RDWR); 2. mmapNULL, 实际有效文件大小 PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0
## mmap特性
- fifo、mmap 都可以应用于非血缘关系进程间通信。区别 - mmap数据可以重复读写。 - fifo数据只能一次性读写。 - 直接操作内存执行速度快
5.3匿名映射
- 只能应用于有血缘关系的进程间通信 p (int *)mmap(NULL, 400, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0); - MAP_ANONYMOUS 、MAP_ANON 只在 Linux 系统中有效。 - /dev/null : 设备文件。黑洞文件。特性无限向该文件写数据。写入没 - /dev/zero: 设备文件。特性无限从该文件读取数据。读多少有多少。读到的都是“\0” - 类unix系统中没有 MAP_ANONYMOUS 、MAP_ANON 选项可以借助 /dev/zero 实现。 fd open(/dev/zero, O_RDWR);p mmap(NULL, size, PROT_READ|PROT_WRITE, MMAP_SHARED, fd, 0);
6.进程间通信
6.1父子进间通信
1. 父进程 先创建 映射区。 open(O_RDWR) mmapMAP_SHARED; 2. fork() 创建子进程。 3. 一个进程使用 映射区读另一个进程写。
6.2无血缘关系进程间通信
1. 两个进程打开同一个文件创建映射区。 2. 指定 flags 为 MAP_SHARED。 3. 一个进程使用 映射区读另一个进程写。