使用Linux信号量
linux线程间通信的几种方法

linux线程间通信的几种方法Linux是一种开源的操作系统,它支持多线程编程,因此线程间通信是非常重要的。
线程间通信是指在多个线程之间传递数据或信息的过程。
在Linux中,有多种方法可以实现线程间通信,本文将介绍其中的几种方法。
1. 信号量信号量是一种用于线程间同步和互斥的机制。
它可以用来控制对共享资源的访问。
在Linux中,信号量是由sem_t类型的变量表示的。
它有三个主要的操作:初始化、P操作和V操作。
初始化操作用于初始化信号量的值。
P操作用于获取信号量,如果信号量的值为0,则线程会被阻塞,直到信号量的值大于0。
V操作用于释放信号量,将信号量的值加1。
下面是一个使用信号量实现线程间通信的例子:```#include <stdio.h>#include <pthread.h>#include <semaphore.h>sem_t sem;void *thread1(void *arg){sem_wait(&sem);printf("Thread 1\n");sem_post(&sem);pthread_exit(NULL);}void *thread2(void *arg){sem_wait(&sem);printf("Thread 2\n");sem_post(&sem);pthread_exit(NULL);}int main(){pthread_t t1, t2;sem_init(&sem, 0, 1);pthread_create(&t1, NULL, thread1, NULL); pthread_create(&t2, NULL, thread2, NULL); pthread_join(t1, NULL);pthread_join(t2, NULL);sem_destroy(&sem);return 0;}```在这个例子中,我们创建了两个线程,它们都需要获取信号量才能执行。
信号量的作用与使用方法

信号量的作用与使用方法一、引言信号量是一种用于同步和协调多个进程或线程的工具,它在多任务环境下起着至关重要的作用。
通过使用信号量,我们可以控制对共享资源的访问,避免竞争条件和死锁等问题,提高系统的效率和稳定性。
本篇文章将详细介绍信号量的作用与使用方法。
二、信号量的基本概念信号量是一个整数值,用于表示系统中可供使用的资源数量。
它通常用两个值来表示:非零值表示可用资源数量大于零,而零或负值表示资源数量不足。
通常用一个P(Proberen)和V(Verwerken)操作来改变信号量的值,P操作用于减少信号量的值,表示请求资源,如果资源可用,则减少资源数量并返回成功;如果资源不可用,则等待资源可用后再执行后续操作。
V操作用于增加信号量的值,表示释放资源,当一个进程完成了对资源的占用后,它可以通过执行V操作来释放资源供其他进程使用。
三、信号量的作用1. 同步:通过使用信号量,可以控制多个进程或线程对共享资源的访问。
当一个进程需要访问共享资源时,它会等待信号量变为可用状态,然后进入临界区访问资源。
这样,多个进程或线程可以按照一定的顺序访问共享资源,避免竞争条件和死锁等问题。
2. 避免资源浪费:通过使用信号量,可以控制资源的分配和释放,避免不必要的资源浪费和系统负载过高。
3. 协调任务执行:信号量可以用来协调多个任务之间的执行顺序和时间分配,从而提高系统的整体效率。
四、信号量的使用方法1. 初始化信号量:在使用信号量之前,需要先对其进行初始化。
通常,我们会使用一个初始值为1的信号量来表示共享资源的可用数量。
2. 申请资源:当一个进程需要访问共享资源时,它会使用P操作来请求资源。
如果资源可用,则减少资源数量并允许进程进入临界区;如果资源不可用,则该进程会被阻塞,直到信号量变为可用状态后再继续执行。
3. 释放资源:当一个进程完成对共享资源的访问后,它会使用V操作来释放资源。
这会增加信号量的值,以便其他进程可以申请资源。
Linux之信号量,比较全面,个人总结。

信号量一.什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。
信号量的值为正的时候,说明它空闲。
所测试的线程可以锁定而使用它。
若为0,说明它被占用,测试的线程要进入睡眠队列中,等待被唤醒。
二.信号量的分类在学习信号量之前,我们必须先知道——Linux提供两种信号量:POSIX信号量又分为有名信号量和无名信号量。
有名信号量,其值保存在文件中, 所以它可以用于线程也可以用于进程间的同步。
无名信号量,其值保存在内存中。
倘若对信号量没有以上的全面认识的话,你就会很快发现自己在信号量的森林里迷失了方向。
三.内核信号量1.内核信号量的构成内核信号量类似于自旋锁,因为当锁关闭着时,它不允许内核控制路径继续进行。
然而,当内核控制路径试图获取内核信号量锁保护的忙资源时,相应的进程就被挂起。
只有在资源被释放时,进程才再次变为可运行。
只有可以睡眠的函数才能获取内核信号量;中断处理程序和可延迟函数都不能使用内核信号量。
count:相当于信号量的值,大于0,资源空闲;等于0,资源忙,但没有进程等待这个保护的资源;小于0,资源不可用,并至少有一个进程等待资源。
wait:存放等待队列链表的地址,当前等待资源的所有睡眠进程都会放在这个链表中。
sleepers:存放一个标志,表示是否有一些进程在信号量上睡眠。
2.内核信号量中的等待队列(删除,没有联系)上面已经提到了内核信号量使用了等待队列wait_queue来实现阻塞操作。
当某任务由于没有某种条件没有得到满足时,它就被挂到等待队列中睡眠。
当条件得到满足时,该任务就被移出等待队列,此时并不意味着该任务就被马上执行,因为它又被移进工作队列中等待CPU资源,在适当的时机被调度。
内核信号量是在内部使用等待队列的,也就是说该等待队列对用户是隐藏的,无须用户干涉。
由用户真正使用的等待队列我们将在另外的篇章进行详解。
3.内核信号量的相关函数(2)申请内核信号量所保护的资源:4.内核信号量的使用例程在驱动程序中,当多个线程同时访问相同的资源时(驱动中的全局变量时一种典型的共享资源),可能会引发“竞态“,因此我们必须对共享资源进行并发控制。
linux sem用法

linux sem用法Linux系统中的sem(信号量)是一种用于进程间通信和同步的机制。
它提供了一种多个进程之间能够互斥地访问共享资源的方法。
在本文中,我将详细介绍sem的用法,并一步一步地回答您的问题。
第一步:什么是sem?Sem是由Linux内核提供的一种进程同步原语。
它允许进程在对共享资源的访问上进行同步,以避免竞争条件的发生。
它可以用于实现互斥访问共享资源的目的。
第二步:sem的创建和初始化在Linux中,可以使用semget()函数创建一个新的信号量,或者使用semget()函数打开一个已经存在的信号量。
创建新的信号量时,需要指定一个键值,这个键值标识了信号量的唯一性。
创建一个新的信号量的示例代码如下:cint semid = semget(key, 1, IPC_CREAT IPC_EXCL 0666);初始化信号量的值可以使用semctl()函数,其中第二个参数是信号量的编号,第三个参数是命令,第四个参数是信号量的初始值。
初始化信号量的示例代码如下:cunsigned short sem_array[1] = {1}; 初始信号量为1union semun arg;arg.array = sem_array;semctl(semid, 0, SETALL, arg);第三步:sem的P操作和V操作一旦创建和初始化了信号量,就可以使用semop()函数对信号量进行P操作(减法操作)和V操作(加法操作)。
P操作会将信号量的值减1,如果信号量的值为0,则进程将会被阻塞,直到信号量的值大于0为止。
V操作会将信号量的值加1。
如果有多个进程在等待该信号量,则会选择其中一个进行唤醒。
P操作的示例代码如下:cstruct sembuf sb;sb.sem_num = 0;sb.sem_op = -1;sb.sem_flg = SEM_UNDO; semop(semid, &sb, 1);V操作的示例代码如下:cstruct sembuf sb;sb.sem_num = 0;sb.sem_op = 1;sb.sem_flg = SEM_UNDO; semop(semid, &sb, 1);第四步:sem的销毁当信号量不再需要时,可以使用semctl()函数进行销毁。
linux信号量实现原理

linux信号量实现原理【导言】Linux作为开源操作系统,在程序设计和开发方面广泛应用。
而信号量Semaphore作为进程同步和互斥的一种机制,在Linux系统中也广泛使用,特别是在多进程编程中。
本文将从概念、原理、实现等方面为读者深入解析Linux信号量的实现原理。
【正文】一、信号量的概念信号量是一种进程同步机制,用于解决多个并发进程或线程的访问共享资源带来的问题。
它是由E.W. Dijkstra在发明了PV操作之后,发明的一种机制,意味着操作系统的发展。
二、信号量的原理Semaphore本身是一个计数器,用于记录可用资源的数量,资源数量非0即1。
在Linux系统中,信号量一般由一个整数和两个操作——PV操作组成。
P操作,称为down操作,表示试图获取资源,如果可用资源的数量大于0,则占用该资源并将可用资源的数量减1;否则阻塞等待。
V操作,称为up操作,表示释放资源,增加可用资源的数量。
信号量使用可有效避免多个进程、线程对共享资源的相互影响,实现了多个进程之间的同步和互斥,从而保证了系统的稳定性和性能。
三、信号量的实现Semaphore实现主要分为两种:System V IPC信号量和POSIX IPC信号量。
System V IPC信号量是最早开发实现的方法,主要是使用semget、semctl、semop三个函数实现。
而POSIX IPC信号量则相对较新,主要是使用sem_init、sem_destroy、sem_wait、sem_post四个函数实现。
System V IPC信号量的实现需要操作系统调用内核,在一定程度上增加了系统的负担,从而影响了系统的性能和稳定性。
而POSIX IPC信号量则更加灵活、高效、可移植。
四、应用实例Semaphore的应用广泛,可以在多进程、多线程编程、操作系统调度、交通管制等方面使用。
在Linux系统中,Semaphore常常用于控制多个进程对共享文件、共享内存的读写访问,避免产生竞争条件,提高了程序执行效率。
信号量的作用与使用方法

信号量的作用与使用方法信号量是操作系统中一种重要的同步机制,用于控制对共享资源的访问。
它是由信号量的值来表示资源的可用数量,通过对信号量进行操作来实现资源的互斥访问和同步操作。
信号量的作用和使用方法对于理解操作系统的并发控制和同步机制有着重要的意义。
一、信号量的作用1. 控制共享资源的访问:当多个进程需要访问共享资源时,通过信号量可以控制对资源的互斥访问,从而避免进程之间发生冲突,保证数据的一致性和完整性。
2. 进程间的同步操作:通过信号量可以实现多个进程之间的同步操作,例如进程等待某个事件发生,等待某个资源可用,或者通知其他进程某个事件已经发生等。
3. 防止死锁的发生:通过恰当地设置信号量的初值和合理地对其进行操作,可以有效地避免进程间的死锁情况的发生,提高系统的可靠性和稳定性。
4. 实现生产者-消费者问题:信号量可以很好地实现生产者-消费者问题,保证生产者和消费者之间的协调和同步。
二、信号量的使用方法1. 初始化信号量:在使用信号量之前,需要对信号量进行初始化,设置其初值。
可以使用系统提供的函数进行初始化,一般情况下将信号量初值设为资源的可用数量。
2. 调用P操作(等待操作):当进程需要访问资源时,首先需要调用P操作对信号量进行减1操作,表示资源的数量减少一个。
如果此时资源不可用,则阻塞当前进程,直到资源可用。
3. 调用V操作(发信号操作):当进程使用完资源后,需要调用V操作对信号量进行加1操作,表示资源的数量增加一个。
如果有其他进程在等待资源,V操作可以释放资源,唤醒等待的进程。
4. 处理信号量对进程访问资源的控制和同步,保证了系统的安全性和稳定性。
通过以上的作用和使用方法,可以看出信号量在操作系统中的重要性和必要性。
在实际的软件开发过程中,合理地应用信号量可以解决多进程并发访问共享资源的问题,保证系统的正确性和高效性。
同时也需要注意使用信号量的时机和方式,避免出现死锁等问题。
通过深入理解信号量的作用和使用方法,可以更好地掌握操作系统的同步机制和并发控制,提高软件开发的质量和效率。
linux中的同步机制

linux中的同步机制Linux中的同步机制在Linux操作系统中,同步机制是一种重要的机制,用于控制并发访问共享资源的顺序和互斥。
它确保多个进程或线程能够有序地访问共享资源,避免数据竞争和不一致的结果。
本文将介绍Linux中常用的同步机制,包括互斥锁、条件变量、信号量和屏障等。
一、互斥锁(Mutex)互斥锁是一种最常见的同步机制,用于保护共享资源的访问。
在互斥锁的帮助下,只有一个进程或线程能够获得锁,其他进程或线程需要等待锁的释放。
Linux提供了多种互斥锁的实现,如pthread_mutex_t和std::mutex等。
使用互斥锁需要注意避免死锁和竞态条件等问题。
二、条件变量(Condition Variable)条件变量是一种用于线程间通信的同步机制,它允许线程在满足特定条件之前等待,从而避免了忙等待的问题。
在Linux中,条件变量通常与互斥锁一起使用。
当某个线程发现条件不满足时,它可以调用条件变量的等待函数将自己阻塞,直到其他线程满足条件并发出信号,唤醒等待的线程。
三、信号量(Semaphore)信号量是一种用于控制并发访问的同步机制,它可以实现对资源的计数和管理。
Linux提供了两种类型的信号量:二进制信号量和计数信号量。
二进制信号量只有两种状态(0和1),用于互斥访问共享资源;计数信号量可以有多个状态,用于限制并发访问的数量。
通过使用信号量,可以实现进程或线程之间的同步和互斥。
四、屏障(Barrier)屏障是一种用于线程同步的机制,它在多个线程到达指定点之前将它们阻塞,直到所有线程都到达后才继续执行。
屏障可以用于并行计算中的阶段同步,确保每个阶段的计算完成后再进行下一阶段的计算。
在Linux中,可以使用pthread_barrier_t来创建和操作屏障。
五、读写锁(ReadWrite Lock)读写锁是一种特殊的锁机制,用于在读操作和写操作之间提供更好的并发性。
读写锁允许多个线程同时读取共享资源,但只允许一个线程进行写操作。
linux信号量底层原理

linux信号量底层原理信号量是Linux中一种重要的同步机制,用于控制多个进程之间的访问权限,避免竞争条件和死锁的发生。
在Linux中,信号量是一个由内核维护的整数,它可以被多个进程共享,并通过原子操作来实现进程间的同步和互斥。
信号的分类在Linux系统中,信号可以分为三类:实时信号、标准信号和POSIX信号。
实时信号是用来通知进程发生了某种事件或异常的一种机制,可以被发送给进程、进程组或者特定的线程。
标准信号是UNIX系统最早引入的信号类型,用于通知进程发生了某种异常或事件。
POSIX信号是一种与POSIX标准相关的信号类型,用于实现更加标准化的信号机制。
信号量的分类在Linux系统中,信号量可以分为两类:二进制信号量和计数信号量。
二进制信号量是一种只能取0或1两个值的信号量,用于实现互斥操作;计数信号量是一种可以取多个值的信号量,用于实现进程间的计数和同步。
信号量的实现在Linux系统中,信号量是通过内核提供的系统调用函数来实现的。
系统调用函数是由内核提供的接口,用于实现用户空间和内核空间之间的通信和数据交换。
在Linux系统中,信号量的实现主要分为以下几个步骤:1. 创建信号量:首先,一个进程需要通过内核提供的系统调用函数来创建一个信号量。
在创建信号量时,进程需要指定信号量的初始值和权限等参数。
2. 操作信号量:进程可以通过系统调用函数对信号量进行P操作(原语操作)和V操作(释放信号量)。
P操作用于获取信号量,并将其减1;V操作用于释放信号量,并将其加1。
3. 销毁信号量:当一个进程不再需要使用信号量时,可以通过系统调用函数来销毁信号量。
在销毁信号量时,进程需要确保所有使用该信号量的进程都已经释放了该信号量。
信号量的应用信号量是Linux系统中一个非常重要的同步机制,广泛应用于进程间的通信和同步。
以下是信号量的一些常见应用场景:1. 进程间的互斥操作:信号量可以用于控制多个进程对共享资源的访问权限,避免竞争条件和死锁的发生。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux内核与编程 内核与编程
结束
提纲
• 进程间通信概述 • 目标问题——哲学家进餐问题 哲学家进餐问题 目标问题
– 问题描述 – 错误与不好的解法 – 并行度较高的解法
• Linux高级 高级IPC机制 高级 机制
– 概述 – System V信号灯 信号灯
Linux内核与编程 内核与编程
返回
semctl(2)——union semun
• union semun的定义为: 的定义为: 的定义为 union semun{ int val; //仅用于 仅用于SETVAL命令 仅用于 命令 struct semid_ds * buf; //用于 用于IPC_SET等命令 用于 等命令 ushort * array; //用于 用于SETALL等命令 等命令 用于 } • 注意,本联合未在出现在任何系统头文件中,因此必须由 注意,本联合未在出现在任何系统头文件中, 应用程序声明。 应用程序声明。
Linux内核与编程 内核与编程
返回
System V IPC对象的存取权限 对象的存取权限
• 为防止共享的 为防止共享的IPC对象被非法访问,必须为 对象被非法访问,必须为IPC对 对象被非法访问 对 象设置存取权限。 象设置存取权限。 • System V IPC对象的存取权限和文件系统中文件 对象的存取权限和文件系统中文件 的存取权限类似,也用9位分 组表示, 位分3组表示 的存取权限类似,也用9位分3组表示,三组分别 代表属主、组成员和其他用户对该IPC对象的存 代表属主、组成员和其他用户对该 对象的存 取权限;每组中三位, 取权限;每组中三位,只用其中的两位表示是否 可读和是否可写。一般为了安全,在创建IPC对 可读和是否可写。一般为了安全,在创建 对 象时应该设置存取权限制为0600,表示仅仅对属 象时应该设置存取权限制为 , 主是可读,可写的。 主是可读,可写的。
Linux内核与编程 内核与编程
错误与不好的解法
• 解法一:可能进入“死锁”状态 解法一:可能进入“死锁”
#define N 5 void philosopher(int i) { while(TRUE){ take-chopstick(i); take-chopstick((i+1)%N); eat(); put-chopstick((i+1)%N); put-chopstick(i); think(); } }
Linux内核与编程 内核与编程
返回
System V信号灯 信号灯
• • • • semget semctl semop P和V的实现 和 的实现
Linux内核与编程 内核与lude <sys/types.h> 原型: #include <sys/ipc.h> #include <sys/sem.h> int semget(key_t key, int nsems, int oflag); • 功能:创建或打开信号灯集合。 功能:创建或打开信号灯集合。 • 返回值:成功返回非负信号灯标识符,出错返回-1。 返回值:成功返回非负信号灯标识符,出错返回-1。 • 说明:1、key是欲创建或打开的信号灯集合的名字; 说明: 、 是欲创建或打开的信号灯集合的名字 是欲创建或打开的信号灯集合的名字; 2、nsems指明信号灯集合中包含的信号灯数; 指明信号灯集合中包含的信号灯数; 、 指明信号灯集合中包含的信号灯数 3、oflag是一个位信息标志,含两部分信息,即存 是一个位信息标志 、 是一个位信息标志,含两部分信息, 位表示存取权限, 取权限和控制字段。低9位表示存取权限,控 取权限和控制字段。 和控制字段 位表示存取权限 制字段中IPC_CREAT位和IPC_EXCL位的设置 制字段中 位 位的设置 情况与参数共同决定了本调用的操作。 情况与参数共同决定了本调用的操作。
Linux内核与编程 内核与编程
返回
semget(2)——工作流程 工作流程
if (key==IPC_PRIVATE) 创建新信号灯集并返回其id; 创建新信号灯集并返回其 else if (与key相关的信号灯集合存在 相关的信号灯集合存在) 与 相关的信号灯集合存在 if ((oflag&IPC_CREAT)&&(oflag&IPC_EXCL)) 返回-1; 返回 else if (访问权限允许) (访问权限允许 访问权限允许) 返回与key相关的信号灯集 相关的信号灯集id; 返回与 相关的信号灯集 else 返回-1; 返回 else if (oflag&IPC_CREAT) 创建新信号灯集并返回其id; 创建新信号灯集并返回其 else 返回-1; 返回
Linux内核与编程 内核与编程
返回
哲学家进餐问题的描述
• 五个哲学家围坐在一张圆桌周围,每 五个哲学家围坐在一张圆桌周围, 个哲学家面前都有一碗米饭, 个哲学家面前都有一碗米饭,相邻的 两碗之间有一支筷子(如图)。 两碗之间有一支筷子(如图)。 • 哲学家的生活包含两种活动:即吃饭 哲学家的生活包含两种活动: 和思考。当一个哲学家觉得饿时, 和思考。当一个哲学家觉得饿时,他 就试图分两次去取他左边和右边的筷 每次拿起一支,但不分次序。 子,每次拿起一支,但不分次序。如 果成功地获得了一双筷子, 果成功地获得了一双筷子,他就开始 吃饭,吃完以后放下筷子继续思考。 吃饭,吃完以后放下筷子继续思考。 这样,问题就是, 这样,问题就是,为每个哲学家写一 段程序来描述其行为,要求不死锁。 段程序来描述其行为,要求不死锁。
Linux内核与编程 内核与编程
进程间通信概述( ) 进程间通信概述(2)
• 对于 对于UNIX的发展,贝尔实验室和BSD在进 的发展,贝尔实验室和 的发展 在进 程间通信方面的侧重点有所不同: 程间通信方面的侧重点有所不同:
– 贝尔实验室对 贝尔实验室对Unix早期的进程间通信手段进行 早期的进程间通信手段进行 了系统的改进和扩充,形成了“ 了系统的改进和扩充,形成了“System V IPC”,通信进程局限在单个计算机内; ,通信进程局限在单个计算机内; – BSD则主要考虑跨计算机的进程间通信,形成 则主要考虑跨计算机的进程间通信, 则主要考虑跨计算机的进程间通信 了基于套接口( 了基于套接口(socket)的进程间通信机制。 )的进程间通信机制。
else //偶数号哲学家 偶数号哲学家 { take-chopstick( (i+1)%N); take-chopstick (i); eat(); put-chopstick (i); put-chopstick ((i+1)%N); think(); }
Linux内核与编程 内核与编程
返回
概述
Linux内核与编程 内核与编程
返回
System V IPC的名字 的名字
• System V IPC是有名的,这样可以支持无亲缘关系的进 是有名的, 是有名的 程访问同一的IPC对象。其名字的类型为 对象。 程访问同一的 对象 其名字的类型为key_t,可以由 , ftok函数赋予或直接取值 函数赋予或直接取值IPC_PRIVATE。 函数赋予或直接取值 。 • ftok函数 函数 – 原型:#include <sys/types.h> 原型: #include <sys/ipc.h> key_t ftok(const char * pathname, int id); – 功能:把已存在的路径名和一整数标识符转换成一个 功能: key_t值,称为 值 称为IPC键。 键 – 返回值:成功时返回 返回值:成功时返回IPC键,出错返回 。 键 出错返回-1。 – 说明:1、ftok产生的键值不会是 说明: 、 产生的键值不会是IPC_PRIVATE; 产生的键值不会是 ; 2、不能保证 生成的键值唯一; 、不能保证ftok生成的键值唯一; 生成的键值唯一 3、用于产生键的文件不能在该 、用于产生键的文件不能在该IPC对象存活其 对象存活其 内删除。 内删除。
• System V IPC包含了三种机制,在实现“哲学家进餐问 包含了三种机制, 包含了三种机制 在实现“ 我们只使用信号灯机制。主要的函数如下: 题”时,我们只使用信号灯机制。主要的函数如下: 信号灯 <sys/sem.h> 头文件 创建或打开IPC semget 创建或打开 控制IPC操作 semctl 控制 操作 IPC操作函数 semop 操作函数 • System V IPC对象以 对象以key_t类型的值作为其名字。 类型的值作为其名字。 对象以 类型的值作为其名字 • System V IPC对象以一定的存取权限来控制其访问。 对象以一定的存取权限来控制其访问。 对象以一定的存取权限来控制其访问
Linux内核与编程 内核与编程
semctl(1)——函数说明 函数说明
• 原型:#include <sys/types.h> 原型: #include <sys/ipc.h> #include <sys/sem.h> int semctl(int semid, int semnum, int cmd, union semun arg); • 功能:对semid标识的信号灯集合进行控制。 功能: 标识的信号灯集合进行控制。 标识的信号灯集合进行控制 • 返回值:成功返回非负值,出错返回 。 返回值:成功返回非负值 出错返回-1。 • 说明:1、cmd是对信号灯集的控制命令,有GETVAL, 说明: 、 是对信号灯集的控制命令, 是对信号灯集的控制命令 , SETVAL,GETALL,SETALL,IPC_RMID , , , 我们只用最后的两个。 等,我们只用最后的两个。 2、semnum标识该信号灯集中某成员(以0为第 标识该信号灯集中某成员( 、 标识该信号灯集中某成员 为第 一个),仅用于GETVAL,SETVAL等命令。 ),仅用于 等命令。 一个),仅用于 , 等命令 3、arg是可选的,取决于参数 是可选的, 、 是可选的 取决于参数cmd,GETALL或 , 或 SETALL等命令就要用到参数 等命令就要用到参数arg。 等命令就要用到参数 。