进程间的通信方式(二):管道Pipe和命令管道FIFO
1.概述
1.1管道的特点
2.管道
3.管道实现进程间通信
3.1单个进程中的管道
3.2 父进程fork出子进程
3.3 父进程关闭fd[0] 子进程关闭fd[1]
3.4 代码实现管道通信
#include <stdio.h>
#include <unistd.h>
#include <string.h>int main()
{int fd[2];if (pipe(fd)){perror("pipe");return 1;}// 实现父进程写,子进程读pid_t id = fork();if (id < 0){perror("fork");return 2;}else if (id == 0) // child{close(fd[1]);char buf[128];int cnt = 0;while (cnt++ < 5){ssize_t _s = read(fd[0], buf, sizeof(buf));if (_s > 0){buf[_s] = '\0';;printf("father say to child: %s\n", buf);}else if (_s == 0){printf("father close write");break;}else{perror("read");break;}}close(fd[0]);}else // father{close(fd[0]);char * msg = "hello world";int cnt = 0;while (cnt++ < 5){write(fd[1], msg, strlen(msg));sleep(1);}close(fd[1]);}return 0;
}
3.命名管道(FIFO)
3.1FIFO两个属性
3.2 代码实现命令管道通信
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>int main()
{// 创建管道时需要在mode参数位置传S_IFIFO,表明创建的是命名管道int ret = mkfifo("./.fifo", S_IFIFO | 0644); if (ret < 0){perror("mkfifo");return 1;}int fd = open("./.fifo", O_WRONLY);if (fd < 0){perror("open");return 2;}int cnt = 0;char *msg = "hello world";while (cnt++ < 5){write(fd, msg, strlen(msg));sleep(1);}close(fd);return 0;
}
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>int main()
{int fd = open("./.fifo", O_RDONLY);if (fd < 0){perror("open");return 2;}int cnt = 0;char buf[128];while (cnt++ < 5){ssize_t _s = read(fd, buf, sizeof(buf) - 1);if (_s > 0){buf[_s] = '\0';;printf("server say to client: %s\n", buf);}else if (_s == 0){printf("server close write\n");break;}else{perror("read");}sleep(1);}close(fd);return 0;
}
4. 命令管道和管道的区别
命名管道创建完成后就可以使用,其使用方法与管道一样;
区别在于:
(1)命名管道使用之前需要使用open()打开。这是因为:命名管道是设备文件,它是存储在硬盘上的,而管道是存在内存中的特殊文件。
(2)但是需要注意的是,命名管道调用open()打开有可能会阻塞,但是如果以读写方式(O_RDWR)打开则一定不会阻塞;
(3)命名管道以只读(O_RDONLY)方式打开时,调用open()的函数会被阻塞直到有数据可读;
(4)命名管道如果以只写方式(O_WRONLY)打开时同样也会被阻塞,知道有以读方式打开该管道。
进程间的通信方式(二):管道Pipe和命令管道FIFO相关推荐
- 进程间的通信方式(1)
程序员必须让拥有依赖关系的进程集协调,这样才能达到进程的共同目标.可以使用两种技术来达到协调.第一种技术在具有通信依赖关系的两个进程间传递信息.这种技术称做进程间通信(interprocess com ...
- step4 . day7 进程间的通信方式
进程间的通信方式: 无名管道(pipe) 有名管道 (fifo) 信号(signal) system v5的进程间通信方式 共享内存(share memory) 消息队列(message queue) ...
- unix进程间的通信方式
unix进程间的通信方式 (1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信. (2)命名管道(named pipe):命名管道克服了管道 ...
- 1、几种进程间的通信方式
1.几种进程间的通信方式 # 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系. # 有名管道 (named ...
- msgget();msgsnd();msgrcv();msgctl(); 消息队列 Linux进程间的通信方式之消息队列
Linux进程间的通信方式 ----消息队列. 消息队列和共享内存类似 消息队列它允许一个或多个进程向它写消息,一个或多个进程向它写读消息. 消息队列存在于系统内核中,消息的数量受系统限制. 我们来看 ...
- 共享内存(进程间的通信方式)
目录 1.共享内存的特点 2.函数接口 3.有关共享内存的系统命令 1.共享内存的特点 (1)共享内存是一种最高效的进程间的通信方式,进程可以直接读写内存,而进程之间不需要通过任何数据的拷贝. (2) ...
- Linux进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)
整理自网络 Unix IPC包括:管道(pipe).命名管道(FIFO)与信号(Signal) 管道(pipe) 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道 ...
- 进程间的通信方式(管道,消息队列,共享内存,信号)
目录 了解 使用管道来通信 无名管道 有名管道 消息队列 key 键值生成 共享内存 信号 信号概述 信号如何携带消息 信号发送函数: 信号量 了解 创建进程后实现父子通讯的连接. 我们希望有一个管道 ...
- Linux 进程 | 进程间的通信方式
文章目录 管道 匿名管道 pipe 命名管道 FIFO 共享内存 共享内存的使用流程: 消息队列 信号量 套接字 在之前的博客中讲过,虚拟空间出现的其中一个目的就是解决 进程没有独立性,可能访问同一块 ...
最新文章
- [MATLAB调试笔记]Update magnetic field in one step
- scala 去除重复元素_Scala程序从列表中删除重复项
- springboot幂等性_SpringBoot+Redis实现接口幂等性,就看这篇了
- js获取当前时间戳,仿PHP函数模式
- python中列表操作
- C# 读书笔记之访问虚方法、重写方法和隐藏方法
- 内存一致性模型(Memory Consistency Models)
- 最新声音鉴定鉴卡引流神器PHP源码
- IOS AirPrint功能
- 平差的理解及一种最简单的高斯马尔科夫模型(Gauss Markov Model)
- 计算机水平cet2是什么等级,英语cet2等级考试试题
- 实验二 译码器及其应用
- Win10家庭版安装软件时提示“为了对电脑进行保护,已经阻止此应用”
- 【板栗糖GIS】联想win11如何解决浏览器edge默认页面无法修改的问题
- node.js(二 --- events 、buffer、)
- iPhone忘记访问限制密码的解决方案
- Qt笔记(十五)之设置程序图标
- 不定宽高,实现盒子左右垂直居中
- JSoup模拟登录新版正方教务系统(内网-教务系统)获取信息过程详解
- 使用关键字like进行模糊查询