zoukankan      html  css  js  c++  java
  • 关于linux信号量的基本使用

     
          Linux信号量(semaphore)是一种互斥机制。即对某个互斥资源的访问会收到信号量的保护,在访问之前需要获得信号量。
    在操作完共享资源后,需释放信号量,以便另外的进程来获得资源。获得和释放应该成对出现。
           获得信号量集,需要注意的是,获得的是一个集合,而不是一个单一的信号量。
           #include <sys/types.h>
           #include <sys/ipc.h>
           #include <sys/sem.h>
    1:       int semget(key_t key,int nsems,int semflg);
              key:系统根据这个值来获取信号量集。
              nsems:此信号集包括几个信号量。
              semflg:创建此信号量的属性。 (IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR)
              成功则返回该信号量集的ID。
    注:
    既指定IPC_CREAT又指定IPC_EXCL时,如果系统中该信号量集已经存在,则马上返回。
    如果需要获得存在的信号量,则将此参数置0.
    2:      int semctl(int   semid,int senum,int cmd....)
              semid:信号量ID。
              senum:对信号量集中的第几个信号量进行控制。(从0开始)
              cmd:需要进行的操作。(SETVAL是其中的一个)。
              根据cmd的不同可能存在第四个参数,cmd=SETVAL时,表示同时信号量可以被获得几次,如第四个参数
    num=1表示只能被获得一次,既被信号量保护的资源只能同时被一个程序使用。
              该系统调用,是在对信号量初始化时用的。
    -3:   “3”前面加了"-"表示当需要使用互斥资源时应该做这步。
               int semop(int semid,struct sembuf *sem,int num_elements);
               struct sembuf {
                          unsigned short sem_num;    //该信号量集中的第几个信号量。
                          int sem_op;//需要获得还是释放信号量
                          int sem_flg;//相关动作
              };
              num_elements:需要对该信号量集中的多少个信号量进行处理。
              获得信号量时,将sembuf结构提初始化为:
                         sem_num = 0; //该信号量集中的首个信号量
                         sem_op = -1; //获得信号量
                         sem_flag = IPC_NOWAIT;   //如果不能获得信号量,马上返回。
              semop(semid,_sem,1);
              同理释放信号量时,将sem_op设为1.
  • 相关阅读:
    NO17--vue父子组件间单向数据流的解决办法
    NO--16 vue之父子组件传值
    使用Element-ui开发桌面应用的小问题
    微信小程序右到左联动
    微信小程序左到右联动
    微信小程序选项卡之跳转
    微信小程序
    回调函数和钩子函数的说明
    最近项目中遇到了一个场景,其实很常见,就是定时获取接口刷新数据。那么问题来了,假设我设置的定时时间为1s,而数据接口返回大于1s,应该用同步阻塞还是异步?
    组件的相互嵌套slot内容分发
  • 原文地址:https://www.cnblogs.com/nufangrensheng/p/2943961.html
Copyright © 2011-2022 走看看