<linux进程>system-V信号量的基本操作

来源:互联网 发布:ubuntu升级到16.04 编辑:程序博客网 时间:2024/05/20 07:35

system-V信号量机制有点古老,用于进程间:

一、写数据:

#include <stdio.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>//semget()#include <sys/shm.h>#include <errno.h>union semun{int val;struct semid_ds *buf;unsigned short *array;struct seminfo *_buf;};int main(int argc, char *argv[]){// 0.0 获取当前未用的IPC的keykey_t key_s = ftok(".", 1);// 用于信号量key_t key_m = ftok(".", 2);// 用于共享内存// 0.1 创建共享内存int shmid = shmget(key_m, 1024, IPC_CREAT|0644);// 0.2 映射共享内存char *shmaddr = shmat(shmid, NULL, 0);// 1 获取信号量idint semid = semget(key_s, 2, IPC_CREAT|IPC_EXCL|0644);if (semid == -1 && errno == EEXIST){semid = semget(key_s, 2, 0644);}else{// 2 初始化// 2.1 读操作初始化为0union semun sem_r;sem_r.val = 0;// 0表示信号量元素的值,也就是说读操作初始值为0semctl(semid, 0, SETVAL, sem_r);// 0表示初始化的是信号量第0个元素(读)// 2.2 写信号量初始化为1union semun sem_w;sem_w.val = 1;// 0表示信号量元素的值,也就是说写操作初始值为1semctl(semid, 1, SETVAL, sem_w);// 0表示初始化的是信号量第0个元素(写)}while (1){// 3 P操作,获取资源struct sembuf op_p[1];op_p[0].sem_num = 1;// 第0个信号量op_p[0].sem_op = -1;op_p[0].sem_flg = 0;semop(semid, op_p, 1);// 4 对资源进行访问,写数据进入printf("写入数据:");scanf("%s", shmaddr);// 5 V操作,释放资源,资源数+1struct sembuf op_v[1];op_v[0].sem_num = 0;// 第0个信号量op_v[0].sem_op = 1;op_v[0].sem_flg = 0;semop(semid, op_v, 1);}return 0;}


二、读数据:

#include <stdio.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>//semget()#include <sys/shm.h>#include <errno.h>union semun{int val;struct semid_ds *buf;unsigned short *array;struct seminfo *_buf;};int main(int argc, char *argv[]){// 0.0 获取当前未用的IPC的keykey_t key_s = ftok(".", 1);// 用于信号量key_t key_m = ftok(".", 2);// 用于共享内存// 0.1 创建共享内存int shmid = shmget(key_m, 1024, IPC_CREAT|0644);// 0.2 映射共享内存char *shmaddr = shmat(shmid, NULL, 0);// 1 获取信号量idint semid = semget(key_s, 2, IPC_CREAT|IPC_EXCL|0644);/* ===== 初始化时判断有没有被其它进程初始化过========== */if (semid == -1 && errno == EEXIST){semid = semget(key_s, 2, 0644);}else{// 2 初始化// 2.1 读操作初始化为0union semun sem_r;sem_r.val = 0;// 0表示信号量元素的值,也就是说读操作初始值为0semctl(semid, 0, SETVAL, sem_r);// 0表示初始化的是信号量第0个元素(读)// 2.2 写信号量初始化为1union semun sem_w;sem_w.val = 1;// 0表示信号量元素的值,也就是说写操作初始值为1semctl(semid, 1, SETVAL, sem_w);// 0表示初始化的是信号量第0个元素(写)}/* ======================= end ================== */while (1){// 3 P操作,获取写资源struct sembuf op_p[1];op_p[0].sem_num = 0;// 第0个信号量op_p[0].sem_op = -1;op_p[0].sem_flg = 0;semop(semid, op_p, 1);// 4 对资源进行访问,读数据printf("读到的数据:%s\n", shmaddr);// 5 V操作,释放读资源,资源数-1struct sembuf op_v[1];op_v[0].sem_num = 1;// 第0个信号量op_v[0].sem_op = 1;op_v[0].sem_flg = 0;semop(semid, op_v, 1);}return 0;}



阅读全文
0 0