当前位置: 首页 > article >正文

IO进程 day06

IO进程 day06

  • 10. 线程间的通信机制
    • 10.5. 死锁
      • 死锁产生的必要条件
  • 11. 进程间通信机制
    • 11.1. 进程间的通信方式
    • 11.2.无名管道
      • 特点
      • pipe
    • 11.3. 有名管道
      • 特点
      • mkfifo

10. 线程间的通信机制

10.5. 死锁

 是指两个或两个以上的进程/线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去

死锁产生的必要条件

  1. 互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用
  2. 不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。
  3. 请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有。
  4. 循环等待,即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路。
    注意当上述四个条件都成立的时候,便形成死锁。当然,死锁的情况下如果打破上述任何一个条件,便可让死锁消失。

11. 进程间通信机制

11.1. 进程间的通信方式

  1. 传统的通信方式:无名管道,有名管道,信号
  2. system V IPC对象:共享内存,消息队列,信号灯集
  3. BSD:套接字

11.2.无名管道

特点

  1. 只能用于具有亲缘关系的进程之间的通信
  2. 半双工的通信模式
  3. 管道可以看成是一种特殊的文件,对于它的读写可以使用文件IO如read、write函数.
  4. 管道是基于文件描述符的通信方式。当一个管道建立时,它会创建两个文件描述fd[0]和fd[1]。其中fd[0]固定用于读管道,fd[1]固定用于写管道。

pipe

#include <unistd.h>
int pipe(int pipefd[2]);

 功能:创建无名管道
 参数:int pipefd[2]创建的文件描述符,下标为0,1对应两个文件描述符
 返回值:成功返回0,失败返回EOF
注意

  1. 管道中读取空了之后,没有数据时,读取阻塞
    char buf[32] = "";     // 写入和读取的地址
	// 管道中没有数据时,读取阻塞
	read(pipefd[0], buf, 5);
	printf("buf = %s\n", buf);
  1. 管道中写满了数据,写入阻塞,写满:64k,至少读出4k空间才能进行写操作
    char full[65536] = "";	// 写满(64k = 65536)
    char arr[4096] = "";	// 空出4k空间
    // 管道中写满数据时,写入阻塞
    write(pipefd[1], full, 65536);
	// 读出4k空间
	read (pipefd[0], arr, 4096);
	
    printf("write befor\n");
    write(pipefd[1], "a", 1);
    printf("write after\n");
  1. 关闭读端,写操作会导致管道破裂,进程结束,收到SIGPIPE
    // 关闭读端,写操作会导致管道破裂,进程结束,收到SIGPIPE
    close(pipefd[0]);
    write(pipefd[1], "a", 1);
    printf("write after\n");

11.3. 有名管道

特点

  1. 有名管道可以使互不相关的两个进程互相通信
  2. 有名管道可以通过路径名来指出,并且在文件系统中可见,但内容存放在内存中
  3. 通过文件IO来操作
  4. 先进先出
  5. 写满和读空时阻塞
  6. 不支持lseek操作

mkfifo

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);

 功能:创建有名管道
 参数:
  const char *pathname管道文件名
  mode_t mode文件权限,8进制数表示0777
 返回值:成功返回0,失败返回EOF,更新error
注意

  1. 在打开管道时,只有完成读端和写端都打开的操作后,才会完成打开管道文件的操作,否则会在打开管道文件的位置阻塞

http://www.kler.cn/a/562056.html

相关文章:

  • Kafka 消费者组内分区分配策略 以及 管理控制台方案
  • 巨控科技的GRM550元出魔抗实现PLC远程下载与维护方案:工业自动化的高效解决方案
  • 图扑农牧林数据分析可视化平台:智慧农业的“数字大脑”
  • 协方差(Covariance)与得分函数:从Fisher信息矩阵看统计关联
  • 互联网医院系统源码解析:如何开发智能化的电子处方小程序?
  • 三角函数和差角公式对于任意角的证明(代数法)
  • Java中文件操作和IO(如果想知道Java中有关文件操作和IO的知识,那么只看这一篇就足够了!)
  • Go小技巧易错点100例(二十三)
  • Screen Wonders for Mac v3.3.1 3D屏保应用 支持M、Intel芯片
  • Spring框架基本使用(Maven详解)
  • 利用逻辑思维链(CoT)为金融AI消除幻觉(上)
  • [字节青训_AI对话框]SSE交互规范、自定义事件、前后端数据传递、状态监听、连接和断开详解
  • 计算机视觉基础 | 数据增强技术:AutoAugment
  • 人工智能丨基于 OCR 识别方法的自动化测试
  • [OS] 基于RR(Round Robin)算法的CPU调度
  • Windows golang安装和环境配置
  • QT各种版本下载安装
  • IP-------GRE和MGRE
  • ERROR 1524 (HY000) Plugin ‘mysql_native_password‘ is not loaded
  • 项目一 - 任务3:搭建Java集成开发环境IntelliJ IDEA