linux环境进程间通信(四) 信号灯

合集下载

Linux环境下计算机联锁系统进程通信的实现

Linux环境下计算机联锁系统进程通信的实现

1 人机会话设备
^ 人 哥 会 话 层

I 联锁机构
t t t 联剖层

件系统 的可靠性和安全性. 因此- 计算机联锁系统中
进程间的数据交换 的准确性与可靠性是保证铁路运
营安全 的关键技术之一. 选择好的系统开发环境是安全软件保证安全性 的重要方面, n x因其健壮性和稳定性等特点, i u A 越 来越显示出其在控制领域 的优越性. 同时提供 了丰 富的进程通信的方法. 此系统在投入使用 以来运行 稳定 , 取得预期的效果.
是根据联锁的需求 , 对输入的操作命令 , 以及联锁机
构当前 的内部信息进行处理 , 改变内部信息 , 产生相
在使用 IC机制的进程间进行 自由流动[ ]如图 2 P 2.
所共 享 内存 的实 现 .
收疆 日期 ,0 6 82 2 0 — —4 0
Vo. 5No 6 12 .
De . 0 6 c2 0
20 0 6年 1 2月
文章埔号 l0 14 7 (0 60 -0 00 0 "3 32 0 ) 60 2 —3 1
Ln x 境下计算机联锁 系统进程通信 的实现 iu 环
路小娟, 董 昱, ’朱正平
707 ) 300
系统的一般结构层次如图 1 所示. 从 图中可以看 出, 联锁机构是联锁系统的核心.
把信号、 道岔和轨道 区段设计为 3 个无关的进程 , 即 信号灯状态进程、 道岔状态进程和区段状态进程 , 他 们完成各 自功能 的同时, 还实 现进程 间的通 信. 把 IC几种结构( P 信号量 、 消息队列和共享 内存) 结合
F孚2 Ie l 睫翻 c哪m i 岫 i tu i一 i I t 时 0 ml I 卜p 酬 nLn x

Linux下信号灯如何使用_华清远见

Linux下信号灯如何使用_华清远见

Linux下信号灯如何使用本篇文章为大家带来的内容是Linux下信号灯该如何使用,是非常有意思的内容,相信你会感兴趣。

话不多少,下面我们就来看看Linux下信号灯如何使用。

一、信号灯简介:Linux支持系统5的信号灯(semaphore),是一种进程间通信的方式,只不过它和管道、FIFO或者共享内存等不一样,信号灯主要用于同步或者互斥对共享资源的访问,它的发明来源于火车运行系统中的“信号灯”,利用信号灯可以实现“PV操作”这种进程间同步机制。

P操作是获得资源,将信号灯的值减1,如果结果不为负则执行完毕,进程获得资源,否则进程睡眠以等待资源别的进程释放资源;V操作则是释放资源,给信号灯的值加1,释放一个因执行P操作而等待的进程。

二、信号灯的两种类型1、二值信号灯:最简单的信号灯形式,信号灯的值只能取0或1,类似于互斥锁。

虽然二值信号灯能够实现互斥锁的功能,但两者的关注内容不同。

信号灯强调共享资源,只要共享资源可用,其他进程同样可以修改信号灯的值;互斥锁更强调进程,占用资源的进程使用完资源后,必须由进程本身来解锁。

2、计数信号灯:信号灯的值可以取任意非负值(当然受内核本身的约束),用来统计资源,其值就代表可用资源的个数。

三、Linux下对信号灯的操作1、打开或创建信号灯对应的系统调用:#include#include#includeint semget(key_t key, int nsems, int semflg);第一个参数key是一个键值,信号灯集的描述符就由系统范围内唯一的一个键值生成。

key可以由ftok函数生产:#include#includekey_t ftok(const char *pathname, int proj_id);ftok返回与系统中的路径pathname相对应的一个键值nsems是信号灯集中信号灯的个数,其最大值取决于具体的系统,如果是0,则代表访问已存在的信号灯集。

Linux进程间通信信号(signal)

Linux进程间通信信号(signal)

Linux进程间通信信号(signal)1. 概念: 1)信号是在软件层次上对中断机制的⼀种模拟,是⼀种异步通信⽅式 2)信号可以直接进⾏⽤户空间进程和内核进程之间的交互,内核进程也可以利⽤它来通知⽤户空间进程发⽣了哪些系统事件。

3)如果该进程当前并未处于执⾏态,则该信号就由内核保存起来,直到该进程恢复执⾏再传递给它;如果⼀个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。

2.⽤户进程对信号的响应⽅式: 1)忽略信号:对信号不做任何处理,但是有两个信号不能忽略:即SIGKILL及SIGSTOP。

2)捕捉信号:定义信号处理函数,当信号发⽣时,执⾏相应的处理函数。

3)执⾏缺省操作:Linux对每种信号都规定了默认操作3.信号: SIGINT:ctrl+c 终⽌信号 SIGQUIT:ctrl+\ 终⽌信号 SIGTSTP:ctrl+z 暂停信号 SIGALRM:闹钟信号收到此信号后定时结束,结束进程 SIGCHLD:⼦进程状态改变,⽗进程收到信号 SIGKILL:杀死信号4.相关函数:1)int kill(pid_t pid, int sig); 功能:信号发送 参数:pid:指定进程 sig:要发送的信号 返回值:成功 0;失败 -12)int raise(int sig); 功能:进程向⾃⼰发送信号 参数:sig:信号 返回值:成功 0;失败 -13)unsigned int alarm(unsigned int seconds) 功能:在进程中设置⼀个定时器 参数:seconds:定时时间,单位为秒 返回值:如果调⽤此alarm()前,进程中已经设置了闹钟时间,则返回上⼀个闹钟时间的剩余时间,否则返回0。

注意:⼀个进程只能有⼀个闹钟时间。

如果在调⽤alarm时已设置过闹钟时间,则之前的闹钟时间被新值所代替4)int pause(void); 功能:⽤于将调⽤进程挂起直到收到信号为⽌。

浅析Linux进程通信的几种方式及其比较

浅析Linux进程通信的几种方式及其比较
摘 要: 本文通过 对 Ln x下几种主要 通信 方式进 行概述 , iu 并结合 Ln x系统的 系统调 用对 OS中的实现进行 简要概述 , iu 并对 其优缺点进行 分析 , 阐述 了在不 同通信情况 下应该 选择何 种通信 方式进行选择。
关 键 词 :iu ; 讯 方 式 Ln x 通 中图分 类号 : 3 TP 9 文献标 识 码 : A
: 兰 C ia N w T c n lge n rd cs h n e e h oo isa d P o u t
高 新 技 术
浅析 Ln x 程通 信 的几种 方式及其 比较 iu 进
曹 鹏
( 解放 军 国际 关 系学 院 , 苏 南京 2 0 3 ) 江 1 09
为数组 sp 的大小 。 os 通信 的 过程 中 , 系统 可 以利 用 M G T 0 S C L 在消 4管道 通信 方式 . 息 队列上 执行 指定 的操作 ,更 具参 数 的不 同 管 道是 Lnx 持 的最 初 U i IC形 式 和权 限 的不 同 ,可 以执行 检索 、删除 等得 操 i 支 u n P x 之一, 当两 个进 程利 用 管道 进行 通 信 时 , 送 作 。 发 信 息 的进程 称 为写 进程 ,接 收 信息 的进 程 称 共 享 的消 息 队列 是一 个 临界 资 源 ,针对 为 读进 程 。管道 通信 方 式 的 中间介 质就 是 文 同一 消息 队列 的诸 发送 和 接收 进程 必 须保 证 件 , 常称 这 种 文件 为 管 道 文 件. 它 就 像 管 互 斥 进入 ,这 种进 程 间 的同步 和互 斥 是 由系 通 道 一样 将一 个 写进程 和 一个 读 进程 连接 在 一 统 提供 的系统 调用 自动实 现 的 ,所 以用户 在 起 , 现两个 进程 之 间 的通 信 。

Linux_进程之间的通信

Linux_进程之间的通信

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2184 root 20 0 64220 4812 3908 R 6.7 0.2 0:00.01 top
1 root 20 0 178784 13560 8556 S 0.0 0.7 0:04.24 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.02 kthreadd 3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp 4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp 5 root 20 0 0 0 0 I 0.0 0.0 0:00.69 kworker/0:0-xfs-cil/dm-0 6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H-kblockd ...............
//此处的load average就表示负载平均值,这三个值代表最近1、5和15分钟的负载情况。
[root@localhost ~]# top top - 09:26:24 up 23 min, 4 users, load average: 0.00, 0.00, 0.00 Tasks: 219 total, 1 running, 218 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.0 us, 0.0 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.2 hi, 0.2 si, 0.0 st MiB Mem : 1965.1 total, 1405.6 free, 260.4 used, 299.1 buff/cache MiB Swap: 2096.0 total, 2096.0 free, 0.0 used. 1545.0 avail Mem

实验六 进程间通信

实验六 进程间通信

3.2 实验内容(2)

进程的管道通信
编写程序,实现进程的管道通信:父进程使用系统调用pipe() 建立一个管道。创建两个子进程p1和p2,分别向管道个发一 条信息后结束: Child 1 is sending a message to parent. Child 2 is sending a message to parent. 父进程从管道中分别接收两个子进程发来的消息并显示在屏 幕上,然后父进程结束。要求父进程先接受子进程p1发来的 消息,然后再接收子进程p2发来的消息。
实验六 进程间通信

预备知识
Linux进程间通信 进程软中断通信
管道和消息队列

实验指导
软中断通信函数
管道通信的使用
消息队列的应用

实验目的、内容
2.1 软中断通信函数(1)

向一个进程或一组进程发送一个信号: int kill(pid, sig)
pid>0时,核心将信号发送给进程pid
理程序
2.1 软中断通信函数(2)

pid_t wait(int * status)
暂时停止目前进程的执行,直到有信号来或子进程结束

pid_t waitpid(pid_t pid, int * status, int options)
pid的取值 pid=-1时,等待任何一个子进程退出,相当于wait() pid=0时,等待进程组ID与目前进程相同的任何子进程 pid<-1时,等待进程组ID为pid绝对值的任何子进程 options有两个常数参数,可使用或运算,不用时设为0 WNOHANG:即使没有任何子进程退出,它也会立即返回 WUNTRACED:子进程进入暂停执行状态并马上返回,但结束 状态不予以理会

linuxC进程间通信信号

linuxC进程间通信信号

已到。 (2)函数格式。 表 8.9 列出了 alarm()函数的语法要点。
表 8.9 所需头文件 函数原型 函数传入值 alarm()函数语法要点 #include <unistd.h> unsigned int alarm(unsigned int seconds) seconds:指定秒数,系统经过 seconds 秒之后向该进程发送 SIGALRM 信 号 成功:如果调用此 alarm()前,进程中已经设置了闹钟时间,则返回上一个 函数返回值 闹钟时间的剩余时间,否则返回 0 出错:1
SIGFPE SIGKILL SIGALRM SIGSTOP SIGTSTP SIGCHLD SIGABORT
◦ 信号的处理流程
◦ 使用信号的场合 1. 后台进程需要使用信号 2. 两个进程之间没有亲缘关系,无法使用无名管道 pipe
3. 如何两个进程之间只能使用标准输入和输出,则无法使用 fifo ◦ 函数声明
表 8.6 信 号 名 SIGHUP 常见信号的含义及其默认操作 含 义 默认操作 终止
该信号在用户终端连接(正常或非正常)结束时发出,通常是在终
端的控制进程结束时,通知同一会话内的各个作业与控制终端不再 关联 SIGINT SIGQUIT SIGILL 该信号在用户键入 INTR 字符(通常是 Ctrl-C)时发出,终端驱动程 序发送此信号并送到前台进程中的每一个进程 该信号和 SIGINT 类似,但由 QUIT 字符(通常是 Ctrl-\)来控制 该信号在一个进程企图执行一条非法指令时(可执行文件本身出现 错误,或者试图执行数据段、堆栈溢出时)发出 该信号在发生致命的算术运算错误时发出。这里不仅包括浮点运算 错误,还包括溢出及除数为 0 等其他所有的算术错误 该信号用来立即结束程序的运行,并且不能被阻塞、处理或忽略 该信号当一个定时器到时的时候发出 该信号用于暂停一个进程,且不能被阻塞、处理或忽略 该信号用于交互停止进程,用户键入 SUSP 字符时(通常是 Ctrl+Z)发出这个信号 子进程改变状态时,父进程会收到这个信号 进程异常终止时发出 终止 终止 终止 终止 终止 终止 暂停进程 停止进程 忽略

linux系统文件操作sem_open,sem_close,sem_post,sem_wait

linux系统文件操作sem_open,sem_close,sem_post,sem_wait

linux系统⽂件操作sem_open,sem_close,sem_post,sem_wait信号灯分为有名信号灯和内存信号灯⼀、Posix有名信号灯1.posix有名信号灯函数函数sem_open创建⼀个新的有名信号灯或打开⼀个已存在的有名信号灯。

有名信号灯总是既可⽤于线程间的同步,⼜能⽤于进程间的同步。

1. sem_open名称::sem_open功能:创建并初始化有名信号灯头⽂件:#include <semaphore.h>函数原形:sem_t *sem_open(const char *name,int oflag,/*mode_t mode,unsigned int value*/);参数:name 信号灯的外部名字oflag 选择创建或打开⼀个现有的信号灯mode 权限位value 信号灯初始值返回值:成功时返回指向信号灯的指针,出错时为SEM_FAILEDoflag参数能是0、O_CREAT(创建⼀个信号灯)或O_CREAT|O_EXCL(如果没有指定的信号灯就创建),如果指定了O_CREAT,那么第三个和第四个参数是需要的;其中mode参数指定权限位,value参数指定信号灯的初始值,通常⽤来指定共享资源的书⾯。

该初始不能超过 SEM_VALUE_MAX,这个常值必须低于为32767。

⼆值信号灯的初始值通常为1,计数信号灯的初始值则往往⼤于1。

如果指定了O_CREAT(⽽没有指定O_EXCL),那么只有所需的信号灯尚未存在时才初始化他。

所需信号灯已存在条件下指定O_CREAT不是个错误。

该标志的意思仅仅是“如果所需信号灯尚未存在,那就创建并初始化他”。

不过所需信号灯等已存在条件下指定O_CREAT|O_EXCL却是个错误。

sem_open返回指向sem_t信号灯的指针,该结构⾥记录着当前共享资源的数⽬。

/*semopen.c*/#include <stdio.h>#include <stdlib.h>#include <fcntl.h> /* For O_* constants */#include <sys/stat.h> /* For mode constants */#include <semaphore.h>int main(int argc,char**argv){sem_t *sem;if(argc!=2){printf(“please input a file name!\n”);exit(1);}sem=sem_open(argv[1],O_CREAT,0644,1);exit(0);}2. sem_close名称::sem_close功能:关闭有名信号灯头⽂件:#include函数原形:int sem_close(sem_t *sem);参数:sem 指向信号灯的指针返回值:若成功则返回0,否则返回-1。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Linux环境进程间通信(四):信号灯- -一、信号灯概述信号灯与其他进程间通信方式不大相同,它主要提供对进程间共享资源访问控制机制。

相当于内存中的标志,进程可以根据它判定是否能够访问某些共享资源,同时,进程也可以修改该标志。

除了用于访问控制外,还可用于进程同步。

信号灯有以下两种类型:∙二值信号灯:最简单的信号灯形式,信号灯的值只能取0或1,类似于互斥锁。

注:二值信号灯能够实现互斥锁的功能,但两者的关注内容不同。

信号灯强调共享资源,只要共享资源可用,其他进程同样可以修改信号灯的值;互斥锁更强调进程,占用资源的进程使用完资源后,必须由进程本身来解锁。

∙计算信号灯:信号灯的值可以取任意非负值(当然受内核本身的约束)。

二、Linux信号灯linux对信号灯的支持状况与消息队列一样,在red had 8.0发行版本中支持的是系统V的信号灯。

因此,本文将主要介绍系统V信号灯及其相应API。

在没有声明的情况下,以下讨论中指的都是系统V信号灯。

注意,通常所说的系统V信号灯指的是计数信号灯集。

三、信号灯与内核1、系统V信号灯是随内核持续的,只有在内核重起或者显示删除一个信号灯集时,该信号灯集才会真正被删除。

因此系统中记录信号灯的数据结构(struct ipc_ids sem_ids)位于内核中,系统中的所有信号灯都可以在结构sem_ids中找到访问入口。

2、下图说明了内核与信号灯是怎样建立起联系的:其中:struct ipc_ids sem_ids是内核中记录信号灯的全局数据结构;描述一个具体的信号灯及其相关信息。

其中,struct sem结构如下:struct sem{int semval; // current valueint sempid // pid of last operation}从上图可以看出,全局数据结构struct ipc_ids sem_ids可以访问到struct kern_ipc_perm的第一个成员:struct kern_ipc_perm;而每个struct kern_ipc_perm能够与具体的信号灯对应起来是因为在该结构中,有一个key_t类型成员key,而key则唯一确定一个信号灯集;同时,结构structkern_ipc_perm的最后一个成员sem_nsems确定了该信号灯在信号灯集中的顺序,这样内核就能够记录每个信号灯的信息了。

kern_ipc_perm结构参见《Linux环境进程间通信(三):消息队列》。

struct sem_array见附录1。

四、操作信号灯对消息队列的操作无非有下面三种类型:1、打开或创建信号灯与消息队列的创建及打开基本相同,不再详述。

2、信号灯值操作linux可以增加或减小信号灯的值,相应于对共享资源的释放和占有。

具体参见后面的sem op系统调用。

3、获得或设置信号灯属性:系统中的每一个信号灯集都对应一个struct sem_array结构,该结构记录了信号灯集的各种信息,存在于系统空间。

为了设置、获得该信号灯集的各种信息及属性,在用户空间有一个重要的联合结构与之对应,即union semun。

联合semun数据结构各成员意义参见附录2信号灯API1、文件名到键值#include <sys/types.h>#include <sys/ipc.h>key_t ftok (char*pathname, char proj);它返回与路径pathname相对应的一个键值,具体用法请参考《Linux环境进程间通信(三):消息队列》。

2、linux特有的ipc()调用:int ipc(unsigned int call, int first, int second, int third, void *ptr, long fifth);参数call取不同值时,对应信号灯的三个系统调用:当call为SEMOP时,对应int semop(int semid, struct sembuf *sops, unsigned nsops)调用;当call为SEMGET时,对应int semget(key_t key, int nsems, int semflg)调用;当call为SEMCTL时,对应int semctl(int semid,int semnum,int cmd,union semun arg)调用;这些调用将在后面阐述。

注:本人不主张采用系统调用ipc(),而更倾向于采用系统V或者POSIX进程间通信API。

原因已在Linux 环境进程间通信(三):消息队列中给出。

3、系统V信号灯API系统V消息队列API只有三个,使用时需要包括几个头文件:#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>1)int semget(key_t key, int nsems, int semflg)参数key是一个键值,由ftok获得,唯一标识一个信号灯集,用法与msgget()中的key相同;参数nsems 指定打开或者新创建的信号灯集中将包含信号灯的数目;semflg参数是一些标志位。

参数key和semflg 的取值,以及何时打开已有信号灯集或者创建一个新的信号灯集与msgget()中的对应部分相同,不再祥述。

该调用返回与健值key相对应的信号灯集描述字。

调用返回:成功返回信号灯集描述字,否则返回-1。

注:如果key所代表的信号灯已经存在,且semget指定了IPC_CREAT|IPC_EXCL标志,那么即使参数nsems与原来信号灯的数目不等,返回的也是EEXIST错误;如果semget只指定了IPC_CREAT标志,那么参数nsems必须与原来的值一致,在后面程序实例中还要进一步说明。

2)int semop(int semid, struct sembuf *sops, unsigned nsops);semid是信号灯集ID,sops指向数组的每一个sembuf结构都刻画一个在特定信号灯上的操作。

nsops 为sops指向数组的大小。

sembuf结构如下:sem_num对应信号集中的信号灯,0对应第一个信号灯。

sem_flg可取IPC_NOWAIT以及SEM_UNDO 两个标志。

如果设置了SEM_UNDO标志,那么在进程结束时,相应的操作将被取消,这是比较重要的一个标志位。

如果设置了该标志位,那么在进程没有释放共享资源就退出时,内核将代为释放。

如果为一个信号灯设置了该标志,内核都要分配一个sem_undo结构来记录它,为的是确保以后资源能够安全释放。

事实上,如果进程退出了,那么它所占用就释放了,但信号灯值却没有改变,此时,信号灯值反映的已经不是资源占有的实际情况,在这种情况下,问题的解决就靠内核来完成。

这有点像僵尸进程,进程虽然退出了,资源也都释放了,但内核进程表中仍然有它的记录,此时就需要父进程调用waitpid来解决问题了。

sem_op的值大于0,等于0以及小于0确定了对sem_num指定的信号灯进行的三种操作。

具体请参考linux相应手册页。

这里需要强调的是semop同时操作多个信号灯,在实际应用中,对应多种资源的申请或释放。

semop保证操作的原子性,这一点尤为重要。

尤其对于多种资源的申请来说,要么一次性获得所有资源,要么放弃申请,要么在不占有任何资源情况下继续等待,这样,一方面避免了资源的浪费;另一方面,避免了进程之间由于申请共享资源造成死锁。

也许从实际含义上更好理解这些操作:信号灯的当前值记录相应资源目前可用数目;sem_op>0对应相应进程要释放sem_op数目的共享资源;sem_op=0可以用于对共享资源是否已用完的测试;sem_op<0相当于进程要申请-sem_op个共享资源。

再联想操作的原子性,更不难理解该系统调用何时正常返回,何时睡眠等待。

调用返回:成功返回0,否则返回-1。

3) int semctl(int semid,int semnum,int cmd,union semun arg)该系统调用实现对信号灯的各种控制操作,参数semid指定信号灯集,参数cmd指定具体的操作类型;参数semnum指定对哪个信号灯操作,只对几个特殊的cmd操作有意义;arg用于设置或返回信号灯信息。

该系统调用详细信息请参见其手册页,这里只给出参数cmd所能指定的操作。

IPC_STAT 获取信号灯信息,信息由arg.buf返回;IPC_SET 设置信号灯信息,待设置信息保存在arg.buf中(在manpage中给出了可以设置哪些信息);GETALL 返回所有信号灯的值,结果保存在arg.array中,参数sennum被忽略;GETNCNT 返回等待semnum所代表信号灯的值增加的进程数,相当于目前有多少进程在等待semnum 代表的信号灯所代表的共享资源;GETPID 返回最后一个对semnum所代表信号灯执行semop操作的进程ID;GETVAL 返回semnum所代表信号灯的值;GETZCNT 返回等待semnum所代表信号灯的值变成0的进程数;SETALL 通过arg.array更新所有信号灯的值;同时,更新与本信号集相关的semid_ds结构的sem_ctime成员;SETVAL 设置semnum所代表信号灯的值为arg.val;调用返回:调用失败返回-1,成功返回与cmd相关:五、信号灯的限制1、一次系统调用sem op可同时操作的信号灯数目SEMOPM,semop中的参数nsops如果超过了这个数目,将返回E2BIG错误。

SEMOPM的大小特定与系统,redhat 8.0为32。

2、信号灯的最大数目:SEMVMX,当设置信号灯值超过这个限制时,会返回ERANGE错误。

在redhat 8.0中该值为32767。

3、系统范围内信号灯集的最大数目SEMMNI以及系统范围内信号灯的最大数目SEMMNS。

超过这两个限制将返回ENOSPC错误。

redhat 8.0中该值为32000。

4、每个信号灯集中的最大信号灯数目SEMMSL,redhat 8.0中为250。

SEMOPM以及SEMVMX是使用semop调用时应该注意的;SEMMNI以及SEMMNS是调用semget时应该注意的。

SEMVMX同时也是semctl调用应该注意的。

六、竞争问题第一个创建信号灯的进程同时也初始化信号灯,这样,系统调用semget包含了两个步骤:创建信号灯;初始化信号灯。

由此可能导致一种竞争状态:第一个创建信号灯的进程在初始化信号灯时,第二个进程又调用semget,并且发现信号灯已经存在,此时,第二个进程必须具有判断是否有进程正在对信号灯进行初始化的能力。

相关文档
最新文档