[国嵌攻略][083][信号互斥编程]

本文通过C语言示例介绍了如何使用信号量和键值进行文件操作,包括信号量的创建、设置、获取、写入数据以及释放。重点阐述了如何通过键值打开信号量,以及信号量的基本操作流程。

信号量分类

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); }

 

转载于:https://www.cnblogs.com/d442130165/p/5225298.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值