[国嵌攻略][083][信号互斥编程]
信号量分类
1.二值信号量:信号量的值只能或0或1。
2.计数信号量:信号量的初始值大于1。
什么是键值
1.文件通过文件名来打开文件,从而得到文件的标示符;信号量通过键值来打开信号量,从而得到信号量的标示符。
2.在创建信号量的时候指定键值。
指定键值
1.选择任意数值
2.通过函数构造,例如:key_t ftok(char *fname, int id)
键值构造函数
key_t ftok(char *fname, int id)
通过文件名取出内核中对应的数值,然后与项目ID组合形成键值。
A.c
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/ipc.h> #include <sys/sem.h> #include <unistd.h> void main(){ //打开文件 int fd; fd = open("board.txt", O_RDWR | O_APPEND); //创建键值 int key; key = ftok("board.txt", 0); //创建信号量 int semid; semid = semget(key, 1, IPC_CREAT); //设置信号量 semctl(semid, 0, SETVAL, 1); //设置信号量0的值为1 //获取信号量 struct sembuf sops; sops.sem_num = 0; sops.sem_op = -1; semop(semid, &sops, 1); //写入数据 write(fd, " math ", 7); //睡眠等待 sleep(10); //写入数据 write(fd, "is cancel ", 11); //释放信号量 sops.sem_num = 0; sops.sem_op = 1;
sops.sem_flg = SEM_UNDO; semop(semid, &sops, 1); //关闭文件 close(fd); }
B.c
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/ipc.h> #include <sys/sem.h> #include <unistd.h> void main(){ //打开文件 int fd; fd = open("board.txt", O_RDWR | O_APPEND); //创建键值 int key; key = ftok("board.txt", 0); //打开信号量 int semid; semid = semget(key, 1, IPC_CREAT); //查看信号量 int semnum; semnum = semctl(semid, 0, GETVAL); //查看信号量0的值 printf("semaphore number is %d\n", semnum); //获取信号量 struct sembuf sops; sops.sem_num = 0; sops.sem_op = -1; sops.sem_flg = SEM_UNDO;
semop(semid, &sops, 1); //写入数据 write(fd, " english exam ", 15); //释放信号量 sops.sem_num = 0; sops.sem_op = 1; semop(semid, &sops, 1); //关闭文件 close(fd); }