zoukankan      html  css  js  c++  java
  • [国嵌攻略][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
    ", 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); }
  • 相关阅读:
    Core Data
    scrollViews
    网络通信
    UIView
    textView取消键盘
    AFNetworking转载
    多线程
    css3[转载][菜单导航] 带有记忆功能的多页面跳转导航菜单
    jQuery翻牌或百叶窗效果
    jQuery联动日历(三)完成
  • 原文地址:https://www.cnblogs.com/d442130165/p/5225298.html
Copyright © 2011-2022 走看看