信号量

信号量本质上就是共享资源的数目,用来控制对共享资源的访问;

信号量可用于进程间的同步和互斥;

每种共享资源对应一个信号量,信号量集就是有很多信号量,便于大量共享资源的操作,信号量集中的所有操作可以要求全部成功,也可以部分成功;

二元信号量(信号灯)值为0和1;

对信号量的操作就是进行PV操作;

 

信号量集的属性:

  

 

 

信号量集的创建:

  int semget(key_t key,int nsems,int flag)

  成功返回信号量集id,失败-1

  参数:

    key:用户指定的信号量集的key

    nsems:信号量集中信号量的个数

    flag:IPC_CREAT、IPC_EXCL等

   @1.创建信号量集(这个集合里有多少个信号量)

 

信号量集控制:

  int semctl(int semid,int semnum,int cmd,.../*union semun arg*/)

  union semun{//根据cmd来确定联合体中的值,只能有一个

    int val;

    struct semid_ds *buf;

    unsigned short *array;

  }

  如果cmd为红框中的值,则联合体为buf;

  如果cmd为绿框中的值,则联合体为val;

  如果cmd为黄框中的值,则联合体为array;

  

 

  参数:

    semid:信号量集id

    semnum:0表示对所有信号量操作,1表示对第一个信号量操作,2表示对第二个信号量操作,以此类推

    buf:信号量集属性指针

    val:获取或设置信号量集中的某个信号量的值

    array:获取或设置信号量集中的所有信号量的值

   @2.对创建的信号量集做初始化(即给每个信号量赋初值)

 

对信号量集的操作:

  int semop(int semid,struct sembuf *sops,size_t nsops)

  成功返回0,失败-1

  struct sembuf{

    unsigned short sem_num;//信号量集中信号量的编号(即哪个信号量),0代表第1个信号量

    short sem_op;//正数为V操作(加操作,1为加1操作,2为加2操作),负数为P操作(减操作,-1为减1操作,-2为减2操作)

    short sem_flg;//SEM_UNDO或IPC_NOWAIT,SEM_UNDO表示进程结束时,相应的操作被取消。如果设置该标志,进程在没有释放共享资源就退出时,内核将代为释放

  }

  参数:

    semid:信号量集id

    sops:sembuf结构体数组

    nsops:第二个参数中结构体数组长度

  可做信号量的加减操作(PV操作),用于互斥和同步

   @3.一个sembuf结构体数组就代表一个信号量,可以对确定的信号量做PV操作(即对sops[0](第一个信号量)做P操作,对sops[1](第二个信号量)做V操作)

posted @ 2023-03-06 22:30  踏浪而来的人  阅读(168)  评论(0编辑  收藏  举报