信号量
一.基本概念的解释
1.信号量:同一时刻只有一个进程可以对临界区域的访问。俗话说相当于一个计数器(计数器记录着有几个进程可以使用),0代表阻塞,1代表执行。
2.临界资源:同一时间只能被一个进程所使用的资源。ey:打印机
临界区:进程访问临界资源的代码区域。
3.原子操作:任何情况下都不能被打断的操作。
4.内核对象:用于对进程间通讯时,多进程能够访问同一资源的记录。
5.信号量的作用:进程间同步控制。(多进程访问临界资源时有顺序,一个执行,其余的处于等待状态,同样锁也是这样的,但是当使用锁时其它进程不能将其终端,但信号量可以)
二.有关信号量的函数
(1)semget(key_t key,int num_sems,int sem_flags);//成功返回一个正数,它为信号量标识符,失败则返回-1,(初始化或创建函数)
Key:信号量键,由此生成一个信号量标识符
num_sems:信号量数目,一般为1
Sem_flags:访问权限,一般为0664,如果没有信号则需要创建时要或上IPC_CREAT.
(2)int semop(int sem_id,struct *sem_ops,size_t num_sem_ops);
//用于改变信号量的值(P,V操作)
sem_id:信号量标识符
sem_ops:结构数组指针
结构为:struct sembuf{
short sem_num;//信号编号,一般为0
short sem_op;//一般-1为P操作,1为V操作
short sem_flg;//通常为SEM_UNDO,用于跟踪信号量的修改情况,如果进程终止但没有释放该信号量,则操作系统会自动释放该信号量
}
(3)int semctl(int sem_id,int sem_num,int command,...);//用来直接控制信号量信息(删除)
Sem_id:semget返回的信号量标识符
Sem_num:信号量编号,一般取0,表示第一个信号量
Command:将要采取的动作,有两种可能SETVAL将信号初始化为一个已知的值,一般为联合体的val,IPC_RMID:用于删除一个已经无需继续使用的信号量标识符。
最后一个为union semun结构:
Union semun{
Int val;
Struct semid_ds *buf;
Unsigned short *array;
}
总结完知识点后,自己为了更加理解信号量,则写了一个题,题为A进程发送OK,后B进程打印100以内的素数,自己所写代码如下
注:为了方便将信号量的创建,修改,删除用函数进行了封装。
sem.c
A进程
B进程
执行结果:
pa为A进程的可执行文件,pb为B进程的可执行文件