23.semop() 功能:信号量操作. 语法:#include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semop(semid,sops,nsops) int semid; struct sembuf *sops; unsigned nsops; 说明:本系统调用用于执行用户定义的在一组信号量上操作的行为集合.
该组信号量与semid相关. 参数sops为一个用户定义的信号量操作结构数组指针. 参数nsops为该数组的元素个数. 数组的每个元素结构包括如下成员: sem_num; /* 信号量数 */ sem_op; /* 信号量操作 */ sem_flg; /* 操作标志 */ 由本系统调用定义的每个信号量操作是针对由semid和sem_num指
定的信号量的.变量sem_op指定三种信号量操作的一种: . 若sem_op为一负数并且调用进程具有修改权限,则下列情况之 一将会发生: * 若semval不小于sem_op的绝对值,则sem_op的绝对值被减去 semval的值.若(semflg&SEM_UNDO)为真则sem_op的绝对值加
上调用进程指定的信号量的semadj值. * 若semval小于sem_op的绝对值同时(semflg&IPC_NOWA99v)为 真,则本调用立即返回. * 若semval小于sem_op的绝对值同时(semflg&IPC_NOWA99v)为 假,则本系统调用将增加指定信号量相关的semncnt值(加一),
将调用进程挂起直到下列条件之一被满足: (1).semval值变成不小于sem_op的绝对值.当这种情况发 生时,指定的信号量相关的semncnt减一,若 (semflg&SEM_UNDO)为真则sem_op的绝对值加上调用 进程指定信号量的semadj值. (2).调用进程等待的semid已被系统删除. (3).调用进程捕俘到信号,此时,指定信号量的semncnt值 减一,调用进程执行中断服务程序. . 若sem_op为一正值,同时调用进程具有修改权限,sem_op的值加
上semval的值,若(semflg&SEM_UNDO)为真,则sem_op减去调用 进程指定信号量的semadj值. . 若sem_op为0,同时调用进程具有读权限,下列情况之一将会发 生: * 若semval为0,本系统调用立即返回. * 若semval不等于0且(semflg&IPC_NOWA99v)为真,本系统调用 立即返回. * 若semval不等于0且(semflg&IPC_NOWA99v)为假,本系统调用 将把指定信号量的 semzcnt值加一,将调用进程挂起直到下列情况之一发生: (1).semval值变为0时,指定信号量的semzcnt值减一. (2).调用进程等待的semid已被系统删除. (3).调用进程捕俘到信号,此时,指定信号量的semncnt值 减一,调用进程执行中断服务程序. 返回值:调用成功则返回0,否则返回-1. 例子:本例将包括上述信号量操作的所有系统调用: #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> #define SEMKEY 75 int semid; unsigned int count; /*在文件sys/sem.h中定义的sembuf结构 * struct sembuf { * unsigned short sem_num; * short sem_op; * short sem_flg; * }*/ struct sembuf psembuf,vsembuf; /*P和V操作*/ cleanup() { semctl(semid,2,IPC_RMID,0); exit(0); } main(argc,argv) int argc; char *argv[]; { int i,first,second; short initarray[2],outarray[2]; extern cleanup(); if (argc==1) { for (i=0;i<20;i++) signal(i,clearup); semid=semget(SEMKEY,2,0777|IPC_CREAT); initarray[0]=initarray[1]=1; semctl(semid,2,SETALL,initarray); semctl(semid,2,GETALL,outarray); printf("sem init vals %d%d \n", outarray[0],outarray[1])[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] 下一页
|