UNIX操作系统中进程通信机制的应用
UNIX系统具有丰富的进程通信手段,其中包括信号、信号灯、管道、消息传递等,这些进程通信机制能有效地完成多个进程之间的信息共享和数据交换,从而保证进程间的协同工作,本文给出了利用信号和信号灯完成特定工作的两个实例。
一、信号灯互斥功能的应用
在多用户操作系统中,信号灯是防止两个或多个进程同时访问共享资源的一种机制。在铁路系统中信号灯可防止两列火车在同一轨道上相撞在计算机系统中,信号灯能保证访问共享资源不会发生混乱。互斥操作要求任何时刻只能有一个或一类进程访问信号灯(执行一个特定的代码区域)。
互斥的应用非常广泛,UNIX操作系统提供了多种用户对共享资源的访问方法;多用户数据库管理系统为保证数据的完整性提供了加锁和解锁功能。另外在设计管理信息系统时经常要进行汇总处理,此时需要加入完全互斥功能;在设计操作员注册管理程序时,有时要求同一时刻只允许每个操作岫次,这就要求具有部分互斥功能。
下面的TEST.C程序程序说明了利用信号灯实现互斥的方法,其中函数Initsem()根据互斥条件确定是否进入互斥临界区,在需进入完全互斥时,只需将KEY 为某个常量即可。
test c
# include
# include
main (argc,argv)
int argc;
char * argv []
{
int semid;
if ( (semid=initsem(operate-ID))
P (semid) ;
· /*临界区*/
·
·
V (semid) ;
·
·
·
initsem(op)
char * op;
{
int id,status=0,semid;
key-t Key ,ftok()
id=atoi(op);
key=ftok(getenv("HOME"),id);/*相同Key值互斥*/
if (semid=semget(key,1,SEMPERM‖IPC-CREAT‖IPC-EXCL))==-1)} if (errno==EEXIST)
semid=semget(key,1,0);
}
else/*if created...*/
status=semct1(semid,0,SETVAL,1);
if(semid==-1‖status==-1){
perror("initsem failed")
return(-1);
}else
return(semid);/*all okay*/
}
P (semid)
int semid;
{
struct sembufp-buf;
p-buf.sem-num=0;
p-buf.sem-op=-1;
p-buf.sem-flg=IPC-NOWAIT;
if (semop (semid, & p-buf,1)==-1) {
perror ("p (semid) falsed");
exit (1);
} else
return (0);
}
V (semid)
int semid;
{
struct sembufv-buf,
v-buf.sem-num=0;
v-buf.sem-op=1;
v-buf.sem-flg=IPC-NOWAIT;
if (semop (semid, &v-buf,1)==-1) {
perror (" v (semid) failed");
exit (1);
} else
return (0)
}
#include
#include
extern int errno;
#define SEMPERM 0600
#define TRUE1
| 论坛热门帖子: | [lch203] 写得蛮好的linux学习笔记(10-21) [黑马制造] 学习java的30个目标(10-19) [笑傲股林] 做测试半年了,有点迷茫,应该再学些什么提高自己的测试水平和测试能力呢?(10-19) [udp8589] 大家用google的来吱一声? 用百度的~~也来报道下?(10-18) [沂偌掳兆] 本人总结的一些认为C++比较经典的书籍,希望对大家有用(10-18) |
| TAG标签: | 机制 应用 通信 进程 操作系统 打印 semid 信号 if #include |
注册
个人空间
