1.信号量的封装完成
#include#include #include #include #include #include union semun { int val; }; #define SEM1 MAX 3 #define SEM1 0 #define SEM1 1 #define SEM1 2 static int semid = -1; void sem_init() { int arr[SEM_MAX] = { 1,0,0 };//信号量初始值 semid semget(key_t)1234, SEM_MAX, IPC_CREAT | IPC_EXCL | 0600); if (semid == -1) { semid = semget(key_t)1234, SEM_MAX, 0600); if (semif == -1) { printf("semget errn"); return; } } else { union semun a; int i = 0; for (; i < SEM_MAX; i++) { a.val = arr[i]; if (semctl(semid, i, SETVAL, a) == -1) { printf("semctl setval errn"); } } } } void sem_p(int index) { if (index < 0 || index >= SEM_MAX) { printf("index errn"); return; } struct sembuf buf; buf.sem_num = index; buf.sem_op = -1;//p操作 buf.sem_flg = SEM_UNDo; if (semop(semid, &buf, 1) == -1) { printf("semop p errn"); } } void sem_v(int index) { if (index < 0 || index >= SEM_MAX) { printf("index errn"); return; } struct sembuf buf; buf.sem_num = index; buf.sem_op = 1;//v操作 buf.sem_flg = SEM_UNDo; if (semop(semid, &buf, 1) == -1) { printf("semop p errn"); } } void sem_destroy() { if (semctl(semid, 0, IPC_RMID) == -1) { printf("sem destroy errn"); } }
创建-链接-断开链接-销毁(大部分情况下只进行前三个操作)
共享内存-基本上一定要用信号量
op:对向量值进行改变
创建信号量:samget
销毁:semctl
A进程和B进程不能使用同一块物理内存,如果要成为共享内存,首先要创建一块共享内存,然后把内存映射到A的地址空间中,再把它映射到B的地址空间之中.
定义一个消息队列,可以添加消息,可以读取消息,如果消息队列为空,则我们不能读取消息,如果消息队列为满,则我们不能添加消息或者发送消息
创建消息,添加消息
获取消息
运行结果:
要收到所有消息吗,则把结果设置为0



