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

嵌入式学习L5进程D9消息队列

在这里插入图片描述
在这里插入图片描述
创建消息
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
消息队列buf
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
发送一次,ipcs多一个
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
消息的删除
在这里插入图片描述
删除了
在这里插入图片描述

信号灯和有名信号灯概念

在这里插入图片描述
进程pv
P申请操作V释放资源
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
shmid是创建,shmat是共享内存附加到当前
在这里插入图片描述
在这里插入图片描述
读的程序
但是第二次就不行了,要捕获ctrl+c去暂停然后处理,就是删除文件

在这里插入图片描述

在这里插入图片描述

无名信号灯

在这里插入图片描述
创建共享内存,子进程和父进程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

System V信号灯使用

创建打开和控制
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
key是ftok生成的
在这里插入图片描述
完整代码`#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <unistd.h>

#define KEY 0x1234 // 自定义信号灯键值
#define NSEMS 1 // 信号灯集合大小

// 定义信号灯操作结构体
struct sembuf P = {0, -1, SEM_UNDO}; // P操作(获取资源)
struct sembuf V = {0, 1, SEM_UNDO}; // V操作(释放资源)

int main() {
// 创建或获取信号灯集
int semid = semget(KEY, NSEMS, IPC_CREAT | 0666);
if (semid == -1) {
perror(“semget failed”);
exit(1);
}

// 初始化信号灯值为1(互斥锁)
if (semctl(semid, 0, SETVAL, 1) == -1) {
    perror("semctl init failed");
    exit(1);
}

pid_t pid = fork();
if (pid == -1) {
    perror("fork failed");
    exit(1);
}

if (pid == 0) {  // 子进程(用户B)
    printf("用户B:等待打印机使用权...\n");
    semop(semid, &P, 1);  // 执行P操作 
    printf("用户B:获得打印机使用权,开始打印文档...\n");
    sleep(3);             // 模拟打印耗时 
    printf("用户B:打印完成,释放使用权\n");
    semop(semid, &V, 1);  // 执行V操作 
} else {          // 父进程(用户A)
    sleep(1);     // 确保子进程先请求信号灯 
    printf("用户A:等待打印机使用权...\n");
    semop(semid, &P, 1);
    printf("用户A:获得打印机使用权,开始打印报表...\n");
    sleep(2);
    printf("用户A:打印完成,释放使用权\n");
    semop(semid, &V, 1);
    wait(NULL);   // 等待子进程结束 

    // 删除信号灯集 
    if (semctl(semid, 0, IPC_RMID) == -1) {
        perror("semctl delete failed");
    }
}
return 0;

}`

相关文章:

  • WWDG窗口看门狗原理
  • Java并发编程核心知识记录,多线程,JUC框架,锁(整理中,未完成)
  • Docker 配置镜像源
  • Vue.js 3 的设计思路:从声明式UI到高效渲染机制
  • 正则表达式(1)
  • 【QT】简易小六壬起卦器 遇事不决 六壬决断
  • Jetson Xavier NX安装CUDA加速的OpenCV
  • Java LeetCode 热题 100 回顾33
  • 硬件基础(4):(6)高精度ADC设计中模拟地与数字地的划分与连接
  • Xilinx ZYNQ FSBL解读:LoadBootImage()
  • 使用苹果M芯片打包Docker Image无法在amd64环境下运行
  • MyBatis Plus 在 Java 项目中的高效使用
  • 【图片批量转换合并PDF】多个文件夹的图片以文件夹为单位批量合并成一个PDF,基于wpf的实现方案
  • 【js逆向】CN man basketball player data
  • 智慧照明奇点已至,塔能科技如何开启升维之战
  • CPU 负载 和 CPU利用率 的区别
  • 结构参数相关性分析
  • 接口自动化入门 —— Http的请求头,请求体,响应码解析!
  • Manus联创澄清:我们并未使用MCP技术
  • 领域驱动设计(DDD)与MVC架构:理念对比与架构选择
  • 网站开发项目实战/品牌广告语经典100条
  • 长春公司网站建设/世界足球排名前100
  • 如何建设网站子页/昆明百度推广开户费用
  • b建设银行网站首页/产品策划方案怎么做
  • 做期货要看哪几个网站/推广赚钱一个2元
  • 淄博网站建设服务/360公司官网首页