信号量函数(semget、semop)

引用自http://blog.csdn.net/guoping16/article/details/6584043

 

所需头文件

#include<sys/types>

#include<sys/ipc.h>

#include<sys/sem.h>


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

执行成功则得到一个信号量集标识符或创建一个信号量集对象,出错返回-1,原因存在error中。

key:0(IPC_PRIVATE):会建立新信号集对象

大于0的32位整数:视semflg来确定操作,通常要求此值来源于ftok返回的IPC键值

nsems:创建信号量集中信号量的个数,该参数只在创建信号量时有效

msgflg:0:取信号量集标识符,若不存在则函数会报错

               IPC_CREAT:当semgflg&IPC_CREAT为真时,如果内核存在键值与key相等的信号量集,返回此信号量集的标识符,如果不存在,则新建一个信号量集;

      IPC_CREAT|IPC_EXCL:如果内核中不存在键值与key相等的信号量集,则新建一个消息队列;如果存在则报错。

 

int semop(int semid,structsembuf*sops,unsigned nsops)

成功返回信号量的个数,失败返回-1,错误原因存于error中。

semid:信号量集标识符

sops:指向进行操作的信号量集结构体数组首地址

struct sembuf{

short semnum; //信号量编号

short val; //若val>0进行V操作,信号量+val,表示进程资源;

//若val<0进行P操作,信号量-val,若信号量(semval)-val<0,则调用进程阻塞,直到资源可用;

若设置IPC_NOWAIT不会睡眠,进程直接返回EAGIN错误

//若val==0是阻塞等待信号信号量为0,调用进程进入睡眠状态,直到信号值为0;

若设置IPC_NOWAIT,进程不会睡眠,直接返回EAGAIN错误

short flag; //0,设置信号量的默认操作

            //IPC_NOWAIT设置信号量操作不等待

          //SEM_UNDO选项会让内核记录一个UNDO记录(与调用进程相关),

如果该进程崩溃,则根据这个进程的UNDO记录自动恢复相应信号量的计数值

};

nsops:进行操作信号量的个数,即sops结构变量的个数,需大于或等于1。

下面是信号量操作举例。

structsembuf sem_get={0,-1,IPC_NOWAIT}; /*将信号量对象中序号为0的信号量减1*/

structsembuf sem_get={0,1,IPC_NOWAIT};  /*将信号量对象中序号为0的信号量加1*/

structsembufsem_get={0,0,0};           /*进程被阻塞,直到对应的信号量值为0*/

flag一般为0,若flag包含IPC_NOWAIT,则该操作为非阻塞操作。若flag包含SEM_UNDO,则当进程退出的时候会还原该进程的信号量操作,这个标志在某些情况下是很有用的,比如某进程做了P操作得到资源,但还没来得及做V操作时就异常退出了,此时,其他进程就只能都阻塞在P操作上,于是造成了死锁。若采取SEM_UNDO标志,就可以避免因为进程异常退出而造成的死锁。


http://blog.csdn.net/u013485792/article/details/50764224

关于ftok()函数

key_t ftok(const char *pathname,    //指定的文件名,这个文件必须存在且可以访问

int proj_id);      //子序号它是一个8bit整数。即范围是0-255.


int semctl(int semid,int semnun,int cmd ,union semun arg)

http://blog.csdn.net/guoping16/article/details/6584043


当函数执行成功,则会返回key_t键值,否则返回-1。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux提供了几个信号量函数来实现进程间同步和互斥操作。这些函数包括: 1. `semget()`:创建一个新的信号量或获取一个已有的信号量的标识符。 2. `semop()`:对信号量进行操作,如设置、释放、获取等。 3. `semctl()`:对信号量进行控制,如获取、设置、删除等。 下面是这些函数的详细说明: 1. `semget()` ```c #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semget(key_t key, int nsems, int semflg); ``` 参数说明: - `key`:信号量的标识符,可以使用 `ftok()` 函数生成。 - `nsems`:需要的信号量数量。 - `semflg`:信号量的创建标志,可以是 `IPC_CREAT`、`IPC_EXCL` 或者二者的或运算。 返回值:如果成功,则返回信号量的标识符,否则返回 -1。 2. `semop()` ```c #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semop(int semid, struct sembuf *sops, unsigned nsops); ``` 参数说明: - `semid`:信号量的标识符。 - `sops`:操作信号量的结构体指针。 - `nsops`:操作的信号量数量。 返回值:如果成功,则返回 0,否则返回 -1。 `semop()` 操作信号量的结构体包括: ```c struct sembuf { short sem_num; // 信号量的编号 short sem_op; // 信号量的操作 short sem_flg; // 操作标志 }; ``` 其中,`sem_num` 表示需要操作的信号量的编号,从 0 开始;`sem_op` 表示操作类型,一般为正数(V 操作)或负数(P 操作);`sem_flg` 表示操作标志,一般为 0 即可。 3. `semctl()` ```c #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semctl(int semid, int semnum, int cmd, ...); ``` 参数说明: - `semid`:信号量的标识符。 - `semnum`:信号量的编号,如果是对所有信号量进行操作,则为 0。 - `cmd`:需要执行的控制命令,可以是 `IPC_STAT`、`IPC_SET`、`IPC_RMID` 等。 - 可变参数:根据不同的命令而定,如 `IPC_SET` 则需要传入 `struct semid_ds *buf`。 返回值:根据不同的命令而定,如 `IPC_STAT` 则返回 0,否则返回 -1。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值