UNIX环境高级编程:进程管理和通信
信号灯种类: posix有名信号灯 posix基于内存的信号灯(无名信号灯) System V信号灯(IPC对象) 二值信号灯:值为0或1。与互斥锁类似,资源可用时值为1,不可用时值为0。 计数信号灯:值在0到n之间。用来统计资源,其值代表可用资源数。 System V的信号灯是一个或者多个信号灯的一个集合。其中的每一个都是单独的计数信号灯。System V 信号灯由内核维护 Posix信号灯指的是单个计数信号灯 信号灯的应用: 等待操作是等待信号灯的值变为大于0,然后将其减1;而释放操作则相反,用来唤醒等待资源的进程或者线程 #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> 获取信号量标识 int semget( key_t key, //和信号灯集关联的key值 int nsems, //信号灯集中包含的信号灯数目 int semflg//信号灯集的访问权限,通常为IPC_CREAT | 0666 ); 返回值: 成功:则返回信号量集的IPC标识符。 失败,则返回-1,并且设置errno, EACCES:没有访问该信号量集的权限 EEXIST:信号量集已经存在,无法创建 ENOENT:信号量集不存在,同时没有使用IPC_CREAT 信号操作 int semop( int semid, //信号灯集ID struct sembuf *opsptr, size_t nops //要操作的信号灯的个数 ); 参数: struct sembuf { short sem_num; //要操作的信号灯的编号 short sem_op; //0:等待,直到信号灯的值变成0 //1:释放资源,V操作 //-1:分配资源,P操作 short sem_flg; //0,IPC_NOWAIT,SEM_UNDO }; 返回值: 成功:0 出错:-1 信号控制 int semctl( int semid, //信号灯集ID int semnum, //要修改的信号灯编号 int cmd…/*union semun arg*/ ); 参数: cmd: GETVAL:获取信号灯的值 SETVAL:设置信号灯的值 IPC_RMID:从系统中删除信号灯集合 返回值: 成功:0 出错:-1 进程间通讯方式比较 pipe:具有亲缘关系的进程间,单工,数据在内存中 fifo:用于任意进程间,双工,有文件名,数据在内存 signal:唯一的异步通信方式 msg:常用于cs模式中, 按消息类型访问 ,可有优先级 shm:效率最高(直接访问内存) ,需要同步、互斥机制 sem:配合共享内存使用,用以实现同步和互斥 (编辑:云计算网_泰州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |