美文网首页
linux信号量操作

linux信号量操作

作者: 星q_p光 | 来源:发表于2019-06-13 11:28 被阅读0次

什么是信号量

用来保护公共资源,使得资源在一个时刻只能有一个进程使用。

信号量值为正的时候,说明他空闲;若为0,说明被占有,测试线程要进入睡眠队列中,等待被唤醒。

wait(S)S=S-1;如果S>=0,正常运行,S<0进入等待队列

singnal(S)S=S+1 S>0正常运行,如果S<=0,在等待队列中选择一个进程使其继续运行。

linux提供的两种信号量

1.内核信号量:由内核控制路径使用

2.用户态进程使用的信号量

1)POSIX信号量:分为有名信号量和无名信号量。有名信号量值保存在文件中,可以用于线程和进程间的同步。无名信号量保存在内存中用于线程同步。

引用的头文件:<semaphore.h>

2)system v信号量:一个或多个信号量的集合,对应的是一个信号量集体,常用于进程同步。

引用的头文件:<sys/sem.h>

linux 信号量集操作函数:

1.semget

int semget(key_t key,int nsems,int semflg)创建或打开一个已创建的信号量集,执行成功会返回信号量的ID否则返回-1

key:创建或打开的信号量集的键值,常用IPC_PRIVATE由系统分配。

nsems 新建信号量集中的信号量个数,通常为1。

semflg:对信号量集合进行打开或存取

            IPC_CREAT:创建

            IPC_EXCL:要和creat结合使用,要么创建一个新的集合,要么对已经存在的集合返回-1

2.semop

int semop(int semid,struct sembuf *sops,unsigned nsops) 对信号量集中的信号量进行指定的操作。借助sembuf增加或减少信号量的值,执行成功返回0,否则返回-1;

semid:信号量集的id

sops:数组类型

nsops:sops数组大小

3.semctl

int semctl(int semid,int semnum,int cmd);

semnum索引量的标识

cmd要执行的命令

sembuf

struct sembuf sem_b;

sem_b.sem_num = 0;//操作的信号量在信号量集中的索引值

sem_b.sem_op= -1;负数表示p操作,正数表示v操作

sem_b.sem_flg=SEM_UNDO;//操作标志,sem_undo

进程意外结束时恢复信号量的操作。

相关文章

  • Linux

    操作系统 Linux进程间通信方式:Socket、共享内存、消息队列、信号量 epoll、select、poll ...

  • linux信号量操作

    什么是信号量 用来保护公共资源,使得资源在一个时刻只能有一个进程使用。信号量值为正的时候,说明他空闲;若为0,说明...

  • Linux内核教程(1) - 道路千万条,调试最重要

    Linux内核教程(1) - 道路千万条,调试最重要 从信号量说起 大家可能都学过操作系统,在操作系统课上,在进程...

  • IPC机制

    2.1 Android IPC机制任何一个操作系统都需要IPC机制,Linux可以通过共享内存,管道,信号量来进行...

  • Linux 信号量

    信号量在在Linux中有着举足轻重的地位,Linux中一些异常错误也由信号量触发,另外信号量也可以用来做进程间的通...

  • Linux IPC之信号量

    创建一个信号量 将信号量初始化|设置信号量的值 获取信号量的值 实现PV操作 参数cmd为执行的操作 IPC_RM...

  • 第二章 信号量机制及几个经典例题

    1.信号量机制 信号量机制即利用pv操作来对信号量进行处理。 什么是信号量?信号量(semaphore)的数据结构...

  • 教育

    网络&操作系统 1.进程通信的方式有哪些,linux中管道的底层原理 管道、消息队列、共享内存、信号量、信号、so...

  • 哈工大操作系统实验(四)进程同步

    本次实验比较简单,相较于前几届需要在linux0.11 底下实现信号量,这次只需要在linux下写个利用信号量解决...

  • 学习笔记5

    Linux多线程同步机制 - 信号量信号量函数定义如下:include int semctl(int sem_i...

网友评论

      本文标题:linux信号量操作

      本文链接:https://www.haomeiwen.com/subject/yluqxctx.html