progressMSG进程间通信


title: 进程间通信
date: 2024-08-02 21:46:55
tags:
cover: https://picbed0521.oss-cn-shanghai.aliyuncs.com/blogpic/202409230856421.png

原文及更多原创文章见我的网站: www.supdriver.top

本篇博客更偏向于总括和导航,部分概念更细致的介绍将内嵌链接在文章中

重点内容

  • 初识进程间通信
  • 管道
  • 消息队列
  • 共享内存
  • 信号量

进程间通信的目的

  • 数据传输: 一个进程需要将它的数据发送给另一个进程
  • 资源共享: 多个进程之间共享同样的资源
  • 通知事件:一个进程需要向另一个或一组进程发送消息通知它(它们)发生了某种事件(如子进程终止时要通知父进程)
  • 进程控制: 有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变

进程间通信的主要方式

  • 管道
  • System V进程间通信
  • POSIX进程间通信

进程间通信的分类

管道

  • 匿名管道
  • 命名管道

System V IPC

  • System V 消息队列
  • SysTem V 共享内存
  • System V 信号量

POSIX IPC

  • 消息队列
  • 共享内存
  • 信号量
  • 互斥量
  • 条件变量
  • 读写锁

管道

怎么使用?戳我去管道博客🔗

首先,管道是Unix中最古老的进程间通信的形式。它用于进程间的单向通信

那么具体是怎样实现的呢?从标题里就可以发现,是基于文件

既然一个文件可以被多个进程打开,那么不妨将文件作为两个进程通信的媒介。但是一般位于磁盘上的文件,IO效率相比于CPU内存之类的读写速度慢了几个数量级,但文件是可以被加载到内存中的,而专门建立在内存中,而没有磁盘文件,专门用于进程间通信的内存级文件,我们就叫它管道文件

管道文件由内核维护


管道文件是单向的,可以是父进程->子进程,也可以子进程->父进程

原子性

头文件提供了宏PIPE_BUF,规定了保证原子性读写操作的最大字节数

  • 当要写入的数据量不大于PIPE_BUF时,linux将保证写入的原子性。
  • 当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。

管道特点

  • 管道提供流式服务
  • 一般而言,进程退出,管道释放,所以管道的生命周期随进程
  • 一般而言,内核会对管道操作进行同步与互斥
  • 一个管道只有一个通信方向,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道

system V共享内存

共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及
内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据,而是直接使用内存中的共享区。

读写共享区内存

挂接上的进程是真正意义上的看到同一块内存,而且完全可以像malloc申请出的一段内存一样操作,比如把共享区的内存当成字符串的缓冲区,直接把标准输入用fgets拷贝到共享内存中

不过默认的共享内存并没有同步互斥行为,需要额外控制,比如使用FIFO命名管道来完成同步操作

戳我去具体介绍🔗

``` dev_update_off() dev_close_window() * 1. 设置图像路径并获取文件列表 ImagePath := 'E:/毕业论文/瓶盖图/' list_image_files(ImagePath, 'default', [], ImageFiles) *自动识别常见图像格式 if (|ImageFiles| == 0) throw('错误:未找到任何图像文件!') endif * 2. 准备显示窗口(根据第一幅图像尺寸) read_image (FirstImage, ImageFiles[1]) get_image_size (FirstImage, Width, Height) dev_open_window (0, 0, 600, 400, 'black', WindowHandle) set_display_font (WindowHandle, 16, 'mono', 'true', 'false') dev_set_draw ('margin') dev_set_line_width (2) * 3. 创建处理进度显示 dev_open_window (0, 620, 300, 100, 'black', ProgWindow) set_display_font (ProgWindow, 14, 'mono', 'true', 'false') * 4. 遍历所有图像文件 for FileIndex := 1 to |ImageFiles| by 1 * 4.1 显示处理进度 dev_set_window (ProgWindow) dev_clear_window () ProgressMsg := '处理进度:' + (FileIndex+1)$'d' + '/' + |ImageFiles|$'d' disp_message (ProgWindow, ProgressMsg, 'window', 12, 12, 'white', 'false') * 4.2 读取并处理当前图像 read_image(Image, ImageFiles[FileIndex]) dev_set_window (WindowHandle) dev_clear_window () * 预处理流程 decompose3 (Image, R, G, B) trans_from_rgb (R, G, B, H, S, V, 'hsv') gauss_filter (V, VFiltered, 5) * 瓶盖区域定位(增加错误处理) threshold (VFiltered, Regions, 80, 255) connection (Regions, ConnectedRegions) select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 5000, 9999999) count_obj (SelectedRegions, NumRegions) if (NumRegions == 0) * 显示错误信息并跳过 dev_display (Image) disp_message (WindowHandle, '瓶盖定位失败:未找到有效区域', 'window', 12, 12, 'red', 'true') disp_continue_message (WindowHandle, 'white', 'true') * 参数说明:窗口句柄 | 文字颜色 | 是否显示倒计时(true/false) wait_key(0) continue endif fill_up (SelectedRegions, RegionFillUp) shape_trans (RegionFillUp, CapRegion, 'convex') * 缺陷检测流程 * ...(与原检测流程保持一致,此处省略重复代码)... * 显示处理结果 dev_display (Image) dev_set_color ('green') dev_display (CapRegion) * 瓶盖定位失败分支: if (NumRegions == 0) dev_display (Image) disp_message (WindowHandle, '瓶盖定位失败:未找到有效区域', 'window', 12, 12, 'red', 'true') disp_continue_message (WindowHandle, 'white', '按任意键继续...') wait_key(0) continue endif * 处理间隔控制: if (FileIndex < |ImageFiles|-1) disp_continue_message (WindowHandle, 'white', '自动继续倒计时...') wait_seconds(1) endif endfor * 5. 处理完成提示 dev_set_window (ProgWindow) dev_clear_window () disp_message (ProgWindow, '批量处理完成!', 'window', 12, 12, 'green', 'true')```wait_key(0)报错显示未知算子或函数
03-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值