相关概念:
1、信号量:操作系统用来解决并发中的互斥和同步问题的一种方法;保证同一时刻只能由一个进程对
某个资源进程访问。
2、p,v 操作:p获取资源,-1,资源不够时会阻塞;v释放资源 +1。
3、作用:帮助用户进程协调使用资源。
4、临界资源:每次只允许一个进程或线程访问的资源。
5、临界区:访问临界资源的代码段。
6、原子操作:一旦开始不能被中断。
7、要想程序效率达到最优,就要合理分配p、v操作之间的临界资源,不能少(以防没有协调进程的同步),不能多(不必要的代码只会使程序的效率降低)。
步骤:
1、创建信号量并且初始化;
2、对信号量进行PV操作;
3、销毁信号量。
两个程序访问同一个资源:
创建信号量或获取已有信号量:
key:通过给两个进程给相同的key 值来获得同一个信号量
nsems:创建多少个信号量,可以是一个,也可以是信号量集
semflg:标志位,信号量不存在就创建IPC_CREAT
用以操作一个信号量集:
semid:semget的返回值
结构体:
sem_num:信号量的编号,只创建一个编号就是0,按下标来表示
sem_op:对信号量是P(-1) 操作还是V(1) 操作
sem_flg:标志位SEM_UNDO(系统内核会记录当前信号量进行的操作,当我们对信号量-1崩溃后系统会自动执行v操作,以防其他程序崩溃)
nsops:每次操作的工作数量
对信号量的控制,比如给初始化,或者移除操作:
semnum:信号量编号
semctl()成功返回 0,失败返回-1
cmd 选项: SETVAL IPC_RMID
最后的参数在删除信号量的时候可以省略,初始化时要加一个(之前定义共用体类型)的一个变量,因为里面有相关的参数,比如信号量的个数等。
-
ipcs 查看共享内存,信号量,消息队列
-
ipcs -s:只查看信号量
-
ipcs -m:只查看共享内存
-
ipcs -q:只查看消息队列
信号量每次使用完之后要手动删除,因为如果程序异常结束信号量会一直存在,删除就可以保证下一次是全新创建,因为如果不手动移除的话我们不清楚上一次进程结束后信号量的值为多少,很有可能对于我们再次要使用信号量的进程来说上一次残留的信号量值并不是我们所期望的。
删除命令:ipcrm -s + id
ipcrm -m + id
ipcrm -q + id