基于Linux的信号量通信机制研究与实现
linux中的signal机制

Linux支持的信号列表如下。很多信号是与机器的体系结构相关的,首先列出的是POSIX.1中列出的信号:
信号 值 处理动作 发出信号的原因
----------------------------------------------------------------------
break;
case 2:
printf("Get a signal -- SIGINT ");
break;
(对于SIGSYS,SIGXCPU,SIGXFSZ,以及某些机器体系结构下的SIGBUS,Linux缺省的动作是A (terminate),SUSv2 是C (terminate and dump core))。
下面是其它的一些信号
信号 值 处理动作 发出信号的原因
(1) 与进程终止相关的信号。当进程退出,或者子进程终止时,发出这类信号。
(2) 与进程例外事件相关的信号。如进程越界,或企图写一个只读的内存区域(如程序正文区),或执行一个特权指令及其他各种硬件错误。
(3) 与在系统调用期间遇到不可恢复条件相关的信号。如执行系统调用exec时,原有资源已经释放,而目前系统资源又已经耗尽。
收 到信号的进程对各种信号有不同的处理方法。处理方法可以分为三类:第一种是类似中断的处理程序,对于需要处理的信号,进程可以指定处理函数,由该函数来处 理。第二种方法是,忽略某个信号,对该信号不做任何处理,就象未发生过一样。第三种方法是,对该信号的处理保留系统的默认值,这种缺省操作,对大部分的信 号的缺省操作是使得进程终止。进程通过系统调用signal来指定进程对某个信号的处理行为。
传递给信号处理例程的整数参数是信号值,这样可以使得一个信号处理例程处理多个信号。系统调用signal返回值是指定信号signum前一次的处理例程或者错误时返回错误代码SIG_ERR。下面来看一个简单的例子:
信号量机制在Linux中的实现

20 0 7年第 4期
文章编号 :0 62 7 (0 7 0 -1 1 3 10 - 5 20 )40 2 - 4 0
计 算 机 与 现 代 化 JS A J Y I N A HU IU N I U X A D I A
总第 10期 4
基金项 目: 江西省教育厅教研 课题资助项 目( 教务字 20 第 6 号 ) 04 7 作者简介 : 17 一 , , (9 4 ) 男 江西南 昌人 , 江西师范大学计算 机信 息工程学 院讲师 , 硕士 , 研究方 向 : 作系统 , 操 计算 机 网络 ; 昌 王 晶(98)男 , 17. , 江西南昌人 , 讲师 , , 硕士 研究方 向: 息系统 , 信 形式化方 法。
为经典 的系统 同步 机制进 行介 绍 , 一般 都仅 限于 原 但
理 的阐述 。由于一 种 机 制 的 实现 往 往 涉及 到系 统 的
P V操作是两个对信号量进行操作 的过程 , / 一般
定义 如下 :
poeu (a : m po ) poeu (a ssm po ) r dr P v s e ahr c e r s e r dr V v : a hr c e r e e
0 引 言
中断 嵌套 可能 会破 坏数 据访 问的完 整性 , 可 由 这 中断屏蔽 来避 免 。但多 进程/ 线程对 共享 数据 的访 问
信号量 (e ahr) L u s po 在 i x中是一种 睡 眠锁 。 m e n 如果有一个进程试图获得一个已被 占用的信号量 , 则 信号量会将其推人一个等待队列 。当持有信号量 的 进程将信号量释放时 , 处于等待队列中的进程将被唤 醒, 并获得该信号量。通常情况下 , 信号量的值为 l , 即在一个时刻 , 最多允许一个进程 占有信号量 , 该种 信号量也称为互斥信号量。当然 , 也可将信号量的值 设为大于 l则该种信号量称 为计数信号量。内核 中 , 基本使用互斥信号量 , 计数信号量只在特殊情况下才 会用到 , 本文主要分析的是互斥信号量。
信号量机制解决互斥问题实验报告

信号量机制解决互斥问题实验报告一、实验目的本实验旨在通过实际操作,深入理解信号量机制在解决互斥问题中的应用,并掌握其实现原理。
通过实验,我们将观察信号量如何确保对共享资源的互斥访问,从而提高多线程程序的安全性和稳定性。
二、实验环境操作系统:Linux编程语言:C语言开发工具:gcc编译器、终端三、实验原理信号量机制是一种常用的同步原语,用于解决多线程或多进程间的互斥问题。
信号量是一个整数值,通常用于表示资源的数量。
在解决互斥问题时,信号量通过维护一个非负的整数值来确保对共享资源的互斥访问。
四、实验步骤创建两个线程,它们需要访问共享资源。
使用信号量来同步这两个线程,确保它们不会同时访问共享资源。
在访问共享资源之前,线程必须获取信号量。
如果信号量的值为0,线程将被阻塞,直到信号量的值变为正值。
当线程完成对共享资源的访问后,释放信号量,使其值加1。
重复上述步骤,直到完成所有线程的同步操作。
五、实验代码实现以下是一个简单的C语言示例代码,演示了如何使用信号量解决互斥问题:#include <stdio.h>#include <pthread.h>// 定义共享资源数和线程数#define RESOURCE_COUNT 5#define THREAD_COUNT 2// 定义信号量变量pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;int semaphore = RESOURCE_COUNT; // 初始化为可用资源数void *thread_func(void *arg) {int i;for (i = 0; i < RESOURCE_COUNT; i++) {pthread_mutex_lock(&mutex); // 获取互斥锁,保护临界区代码printf("Thread %ld is accessing resource %d\n",pthread_self(), i);semaphore--; // 占用一个资源pthread_mutex_unlock(&mutex); // 释放互斥锁,允许其他线程进入临界区代码sleep(1); // 模拟耗时操作}pthread_exit(NULL);}int main() {pthread_t threads[THREAD_COUNT];int i;for (i = 0; i < THREAD_COUNT; i++) {pthread_create(&threads[i], NULL, thread_func, NULL); // 创建线程并执行函数thread_func()}for (i = 0; i < THREAD_COUNT; i++) {pthread_join(threads[i], NULL); // 等待所有线程执行完毕}return 0;}六、实验结果与分析通过运行上述代码,我们可以观察到以下实验结果:在多线程环境下,当一个线程正在访问共享资源时,其他线程将被阻塞,直到资源被释放。
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()函数进行销毁。
操作系统实验报告(进程间的共享存贮区和信号量通信)

case -1:perror("fork()");exit(0);case 0:do_child_loop(sem_set_id,FILE_NAME);exit(0);default:break;}}for(i = 0;i<10;i++){int child_status;wait(&child_status);}printf("main is done");fflush(stdout);return 0;}运行结果:二、共享主存段机制共享主存段为进程提供了直接通过主存进行通信的有效手段,不像消息缓存机制那样需要系统提供缓存,也不像pipe机制那样需要事先建立一个特殊文件,而是有通信双方直接访问某些共享虚拟存储器空间。
在系统V中,系统管理一组共享主存段控制块。
通信进程在使用共享主存段以前,首先提出申请,系统为止分配存储空间并返回共享主存段标识号。
一个共享段建立后,进程把它被附加到自己的虚拟存储空间中。
一个进程可以附加多个共享主存段。
一个主存段一旦被附加到进程的虚拟机空间后,对它的访问以其他虚拟机的访问完全相同。
但为了保证共享主存段数据完整性,通信的进程之间要互斥的进行访问。
当通信进程不再需要该共享主存段时,可使用命令将其与进程分离,从而使其进程的虚空间删除。
为了理解进程通过共享主存段的通信过程,下面举例,一个是进程向共享段写信息的例子:一个是进行从共享段读信息的例子。
代码如下:四、实验过程与分析一、信号量机制在第一个例子的程序中创建了5个并发子进程,互斥地对文件进行写操作,将自己的进程号写到文件中去,信号量的初值为1,当地一个进程执行update_file函数时首先将信号量值-1,(相当于P操作)致使其它进程等待无法操作文件,直到其结束后,将其值变为1后(相当于V操作),其它进程并发竞争对文件的写操作,并将自己的pid 写入文件中。
在linux中信号量机制的执行既步骤如下所示:(1)信号量的定义:struct semaphore {spinlock_t lock;unsigned int count;struct list_head wait_list;};在linux中,信号量用上述结构体表示,我们可以通过该结构体定义一个信号量。
优先级继承运用于Linux内核信号量的研究与实现

( hn s e pes me oi oc s a e , a ga g0 5 0 , hn ) C ieeP o l’Ar dP l eF re d my L n fn 6 0 , C ia c Ac 0
A b t a t I s v r m p ra t t ole t e p o e f p irt n e so y m e n ro i ih rt n e wh n sr c : t i ey i o tn o s v h r blm o ro i i v r in b a s ofp i rt n e i c e y y a
k r l a a s st ets nt m b d e y tm PCM 一 3 0 ene, ndp se h e t e o he e d d s se of 35.
Ke wo d : r r v rin p ir h r a c ; e p oe ra— me e e d ds s m y r s p i i i eso ; roi i e i n e sma h r;e li ; mb d e yt ot n y y t n t t e
.
sma h r p rt n hsp p rraie h ae p ir n ei n e poo o y mo i ig te L n x e p oe o eai ,ti a e e l ste b s roi ih r c r tc l df n h iu o z y t a t b y
~
析 内核信 号量操作源代码 的基 础上 ,基于实时应 用实 现 基本优 先级继承协议 。
d wn f i d) o —al ( e 操作 函数 进入 深度 睡眠状 态 。函数 d wn f i d) o —al ( e 的作 用是通过 调 用函数一d wn) o ( 实
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、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
系统软件与软件工程本栏目责任编辑:谢媛媛Computer Knowledge and Technology 电脑知识与技术第6卷第12期(2010年4月)基于Linux 的信号量通信机制研究与实现袁玉锦,周群(邯郸学院网络中心,河北邯郸056005)摘要:该文以信号量通信理论为基础,通过对Linux 信号量相关系统调用的分析,着重讨论了内核级和用户级的信号量通信、同一进程内线程之间的通信、多用户的进程间的通信等问题,并采用ANSI C 编写了信号量通信的具体实例。
关键词:信号量;Linux ;多进程通信;线程通信中图分类号:TP316文献标识码:A 文章编号:1009-3044(2010)12-3279-031信号量通信理论操作系统原理中利用信号量来解决多进程互斥访问临界资源的问题,还可来描述多进程之间的前趋关系,即同步问题。
信号量的概念由荷兰学者E.W.Dijkstra 于1965年提出。
信号量实际是一个整数,进程(也可以是线程)在信号量上的操作分2种,一种称为P 操作,另一种称为V 操作。
P 操作是让信号量的值减1,V 操作是让信号量的值加1。
在进行实际的操作之前,进程首先检查信号量的当前值,如果当前值大于0,则可以执行P 操作,否则进程休眠,等待其他进程在该信号量上的V 操作,因为其他进程的V 操作将让信号量的值增加,从而它的P 操作可以成功完成。
某信号量在经过某个进程的成功操作之后,其他休眠在该信号量上的进程就有可能成功完成自己的操作,这时系统负责检查休眠进程是否可以完成自己的操作。
在操作系统中,信号量最简单的形式也是最初被提出时定义的形式是一个整数,多个进程可检查并设置信号量的值。
这种检查并设置(Test-and-Set)操作是不可中断的,也称为“原子”操作。
检查并设置操作的结果是信号量的当前值和设置值相加的结果,该设置值可以是正值,也可以是负值。
根据检查并设置操作的结果,进行操作的进程可能会进入休眠状态,而当其他进程完成自己的检查并设置操作后,由系统检查前一个休眠进程是否可以在新信号量值的条件下完成相应的检查并设置操作。
这样,通过信号量,就可以协调多个进程的操作,实现多进程之间通信。
操作系统原理中通常把信号、信号量通信称为低级通信,而把管道、消息队列、共享存储区通信称为高级通信。
信号量分为有名、无名两种,进程间通信用有名信号量,同一进程内部通信一般用无名信号量。
2Linux 中的信号量从意义和实现机理上,Unix System V 或Linux 的信号量与以上所述的常规信号量没有什么区别,但System V 提供的信号量机制要复杂得多,并且分为两种不同系统调用类型:一种是用内核级的信号量,有关系统调用在/usr/include/semaphore.h 中包含,一般可用于内核级的进程通信和内核级的线程通信;另一种是用户级信号量,有关系统调用在/usr/include/sys/sem.h 中包含,一般可用于多用户进程之间通信。
2.1内核级的信号量相关系统调用int sem_init (sem_t *sem ,int pshared ,unsigned int value)作用:为单个信号量设置初值,第一参数*sem 为指定的信号量对象;第二参数pshared 为共享标志,如值为0表示私有信号量,非0表示可以与其他进程共享的信号量;第三参数value 为要为信号量设置的初值。
相关数据结构如下:struct{struct{long int status ;int spin_lock ;}sem_lock ;int sem_value ;pthread_descr sem_waiting ;}sem_tint sem_wait (sem_t *sem);作用:对指定的信号量进行P 操作。
Int sem_post (sem_t *sem);作用:对指定的信号量进行V 操作。
总结:以上是内核级信号量通信常用到的三个系统调用,使用方式较为简单,但主要适用于内核级多线程之间通信,后面将给出多线程通信的具体实例。
收稿日期:2010-02-21作者简介:袁玉锦(1980-),女,河北曲周人,邯郸学院网络中心,助教,学士,研究方向为计算机网络;周群(1981-),女,河北武安人,助教,学士,主要研究方向为计算机网络。
ISSN 1009-3044Computer Knowledge and Technology电脑知识与技术Vol.6,No.12,April 2010,pp.3279-3281E-mail:xsjl@ Tel:+86-551-569096356909643279Computer Knowledge and Technology电脑知识与技术第6卷第12期(2010年4月)2.2用户级信号量相关系统调用int semget(key_t key,int nsems,int semflg);作用:创建一个新的信号量组或获取一个已经存在的信号量组。
返回值为此信号量组的id,第一参数key是系统内表示此组信号量的名字,其值在系统内必须是唯一的整型数,可以人工给定,也可以通过使用其他系统调用自动产生;第二参数nsems表示要创建的信号量组中包含几个信号量;第三参数表示此信号量组的使用权限,即_rwxrwxrwx方式,使用时采用模数方式,如0777表示所有者、同组人和其他人具有所有权限。
int semop(int semid,struct sembuf*sop,int nsops);作用:可以一次对一个或多个信号量进行P,V操作。
第一参数为由semget()返回的信号量组的id;第二参数为一个较为复杂的数据结构,给sop->sem_op赋负值表示P操作,给sop->sem_op赋正值表示V操作;第三参数nsops表示要对此信号量组中的哪个信号量实施P,V操作。
Int semctl(int semid,int semnum,int cmd,semun arg);作用:可以用来获取一些信号量的使用信息或者对信号量赋初值。
第一参数为由semget()返回的信号量组的id;第二参数为要控制的信号量个数;第三参数为控制命令;第四参数的arg.array用来存放信号量的值。
总结:以上是用户级信号量通信常用到的三个系统调用,使用方式较为复杂,但主要适用于多用户进程之间的通信。
后面将给出2个用户进程通信的具体实例。
3信号量通信实例3.1经典“生产者/消费者”问题这一问题可以描述如下:两个进程共享一个公共的、固定大小的缓冲区。
其中一个进程,即生产者,向缓冲区放入信息,另外一个进程,即消费者,从缓冲区中取走信息(该问题一般也可以化为m个生产者和n个消费者)。
当生产者向缓冲区放入信息时,如果缓冲区是满的,则生产者进入休眠,而当消费者从缓冲区中拿走信息后,可唤醒生产者;当消费者从缓冲区中取信息时,如果缓冲区为空,则消费者进入休眠,而当生产者向缓冲区写入信息后,可唤醒消费者。
以下为主要程序代码,一个线程插入1到10000的整数,另一个线程读取并打印。
void*producer(void*data){for(n=0;n<10000;n++){sem_wait(sem_write);/*P操作*/buffer[writepos]=n;/*在缓冲区中保存一个整数*/writepos++;If(writepos>=BUFFER_SIZE)writepos=0;sem_post(sem_read);/*V操作;表示缓冲区中有数据*/}}void*consumer(void*data){while(1){sem_wait(sem_read);/*P操作*/data=buffer[readpos];/*从缓冲区读取数据*/printf(″-->%d\n″,date);readpos++;if(readpos>=BUFFER_SIZE)b->readpos=0;sem_post(sem_write);}}int main(void){sem_t sem_write,sem_read;/*可读取元素个数和可写入的空位个数*/pthread_t th_a,th_b;/*定义线程对象*/sem_init(sem_write,0,BUFFER_SIZE_1);/*初始化为BUFFER_SIZE_1*/sem_init(sem_read,0,0);/*初始化为0*/readpos=writepos=0;/*初始化为缓冲区读写位置*//*建立生产者和消费者线程。
*/pthread_create(&th_a,NULL,producer,0);pthread_create(&th_b,NULL,consumer,0);/*等待生产者和消费者结束。
*/pthread_join(th_a,&retval);pthread_join(th_b,&retval);}程序首先建立2个线程分别扮演生产者和消费者的角色。
生产者负责将1到10000的整数写入缓冲区,而消费者负责从同一个缓冲区中读取并删除由生产者写入的整数。
因为生产者和消费者是2个同时运行的线程,并且要使用同一个缓冲区进行数据交换,因此必须利用信号量机制实现同步。
起初程序初始化了2个信号量,分别表示可读取的元素数目和可写入的空位个数,并分别初始化为0和缓冲区大小减1。
生产者首先对sem_write进行P操作(即sem_wait调用),看是否能够写入,如果此时sem_write信系统软件与软件工程3280本栏目责任编辑:谢媛媛系统软件与软件工程本栏目责任编辑:谢媛媛Computer Knowledge and Technology 电脑知识与技术第6卷第12期(2010年4月)号量的值大于零,则sem_wait 可以立即返回,否则生产者将在该sem_write 信号量上等待。
生产者在将数据写入之后,在sem_read 信号量上进行V 操作(即sem_post 调用)。
此时如果有消费者等待在sem_read 信号量上,则可以被系统唤醒而继续运行。
消费者线程的操作恰恰相反,首先在sem_read 上进行P 操作,当读取数据并打印后,在sem_write 信号量上进行V 操作。
通过上面的例子可见,System V 或Linux 线程(轻量级进程)之间的信号量通信机制是内核级的,其使用的函数在/usr/include/semaphore.h 中说明。
以上代码经修饰后,可在Linux 下编译运行,编译方式为$gcc -o prod_cons.exe -lpthread prod_cons.c 。