[国嵌攻略][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); }

 

posted @ 2016-02-28 18:28  盛夏夜  阅读(297)  评论(0编辑  收藏  举报