首页 > 其他 > 详细

linux信号量

时间:2014-01-19 08:28:02      阅读:467      评论:0      收藏:0      [点我收藏+]

1.1 创建信号量
int semget(
   key_t key,   //标识信号量的关键字,有三种方法:1、使用IPC——PRIVATE让系统产生,
        // 2、挑选一个随机数,3、使用ftok从文件路径名中产生
   int nSemes,  //信号量集中元素个数
   int flag    //IPC_CREAT;IPC_EXCL 只有在信号量集不存在时创建
)
成功:返回信号量句柄
失败:返回-1

1.2 使用ftok函数根据文件路径名产生一个关键字
key_t ftok(const char *pathname,int proj_id);
路径名称必须有相应权限
 key_t key;
 key = ftok(".", 1); 这样就是将fname设为当前目录。

1.3 控制信号量
int semctl(
   int semid,    //信号量集的句柄
   int semnum,   //信号量集的元素数
   int cmd,      //命令
   /*union senum arg */... // 
)
成功:返回相应的值
失败:返回-1

命令详细说明:
cmd:    IPC_RMID 删除一个信号量
    IPC_EXCL 只有在信号量集不存在时创建
    IPC_SET 设置信号量的许可权
   SETVAL 设置指定信号量的元素的值为 agc.val
    GETVAL 获得一个指定信号量的值
    GETPID 获得最后操纵此元素的最后进程ID
    GETNCNT 获得等待元素变为1的进程数
    GETZCNT 获得等待元素变为0的进程数

union senum 定义如下:
union senum{
   int val;
   struct semid_ds *buf;
   unsigned short * array;
}agc;

其中 semid_ds 定义如下:
struct semid_ds{
   struct ipc_pem sem_pem;   //operation pemission struct
   time_t sem_otime;   //last semop()time
   time_t sem_ctime;   //last time changed by semctl()
   struct sem *sembase;   //ptr to first semaphore in array
   struct sem_queue *sem_pending; //pending operations
   struct sem_queue *sem_pending_last; //last pending operations
   struct sem_undo *undo;   //undo requests on this arrary
   unsigned short int sem_nsems; //number of semaphores in set
};

1.4 对信号量 +1 或 -1 或测试是否为0
int semop(
   int semid,
   struct sembuf *sops, //指向元素操作数组
   unsigned short nsops //数组中元素操作的个数
)

结构 sembuf 定义
sembuf{
   short int sem_num; //semaphore number
   short int sem_op; //semaphore operaion
   short int sem_flg //operation flag
};

linux信号量

原文:http://www.cnblogs.com/knightly/p/3525459.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!