嵌入式学习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;
}`