探究Linux C中的信号量机制 (linux c 信号量)

在Linux系统中,信号量机制是一个非常重要的IPC(进程间通信)方式之一。通过使用信号量,可以让多个进程之间互相配合,实现共享资源的访问和互斥访问。本文将从信号量的概念、在Linux系统中信号量的实现方式以及使用信号量实现进程同步和互斥的应用方面进行探究。

一、信号量的概念

信号量(Semaphore)是一种用于多进程之间同步互斥的机制,是操作系统中的一个标准机制,可以用于实现资源的互斥访问和进程之间的同步。在Linux系统中,信号量是一个32位的整数,对其进行原子操作,比如加、减等,用来实现进程的同步、互斥操作。

信号量的定义如下:

typedef union semun{

int val; // 信号量的值

struct semid_ds *buf; // IPC信号量的管理结构体

unsigned short *array; // 数组指针

struct seminfo *__buf; // 具体信息

}semun;

其中,对于不同的应用场景,struct semid_ds和struct seminfo所定义的属性也有所不同。在Linux系统中,信号量常常分为System V IPC和POSIX IPC两种类型。

二、在Linux中的信号量实现方式

在Linux中,信号量的实现方式多种多样,如System V IPC、POSIX IPC、SysVIPC、POSIX named semaphores等,下面主要对System V IPC进行介绍。

System V IPC是一种IPC机制,包括消息队列、信号量和共享内存等。它的实现方式基于内核态,无法在用户态直接操作,需要通过系统调用的方式来操作。

Linux系统中实现信号量机制的主要函数有semget()、semop()和semctl()。

1、 semget()函数:创建和获取一个信号量

通过调用semget()函数来创建和获取一个信号量,semget()函数的定义如下:

#include

#include

#include

int semget(key_t key, int nsems, int sem);

其中,key是信号量的标识符,nsems表示需要的信号量个数,sem则指定信号量的访问权限等设置。

2、semop()函数:进行信号量的加减操作

通过调用semop()函数来进行信号量的加减操作,semop()函数的定义如下:

#include

#include

#include

int semop(int semid, struct sembuf *sops, size_t nsops);

其中,semid是信号量的标识符,sops是一个结构体,用于指定需要进行的操作,nsops表示进行操作的个数。

3、semctl()函数:进行信号量控制操作

通过调用semctl()函数来进行信号量的控制操作,semctl()函数的定义如下:

#include

#include

#include

int semctl(int semid, int semnum, int cmd, …);

其中,semid是信号量的标识符,semnum表示需要控制的信号量在中的下标,cmd表示需要进行的控制操作。

三、信号量的使用

通过信号量的加减操作以及控制操作,可以实现多个进程之间的同步和互斥。比如通过以下方式可以实现多个进程之间的同步:

1、设定一个计数器counter,初值为0

2、定义一个信号量semid,初值为0

3、一个进程P执行semop(semid, 1),如果semid的值为0,则等待;否则counter+1

4、一个进程V执行semop(semid, -1),如果counter为0,则等待;否则counter-1

使用信号量实现进程同步和互斥的应用场景至少有以下几个:

1、文件读写锁

多个进程同时对一个文件进行读写操作时,可能会出现访问竞争的情况,为此可以使用信号量来进行控制,实现文件的读写锁。

2、生产者和消费者

在生产者和消费者的场景中,生产者可以生产一定数量的物品供消费者使用,而消费者则需要在生产数量有限的情况下,对资源进行协调访问,避免竞争的发生,从而保证生产者和消费者之间的协作高效完成。

3、互斥调用

在互斥调用场景中,需要协调多个进程共同访问共享资源,通过使用信号量,可以避免多个进程同时调用共享资源,导致冲突和死锁的情况出现。

相关问题拓展阅读:

  • linux进程间通信问题 我想用共享内存的方式实现信号量控制一个不许并行的的函数 请问下面我的代码合理吗

linux进程间通信问题 我想用共享内存的方式实现信号量控制一个不许并行的的函数 请问下面我的代码合理吗

我想你的目的是有一段代码 (即你标的 /*……….只能单独进行的函数………*/)

在任意时刻最多只能有最多一个进程执行,是吧。

首先,你的腊胡做法是错的…… 简单的说,原因是由于

while( *shmaddr );

*shmaddr = 1;

这两行代码不是一个原子操作,从while判断出 *shmaddr等于0 到 *shmaddr=1 之间,另外一个或多个进程可能也会得到 *shmaddr==0 的判断,从而导致多个进程同时进入 /*……….只能单独进行的函数………*/

具体关于互斥的基本原理,以及你为什么错,可以找一本讲操作系统原理 (关于进程同步戚局游的高销内容)去看。

所以,用 shared memory 来实现进程同步肯定是不行的,正确的做法是使用 semaphore, 具体可以参考 《unix 环境高级编程》中关于 semaphore (信号量)使用的章节。

看你好像完全搞混了。。。什么叫用共享内存的方式实现信号量控制不能并行的代码?

首先共享内存和信号量都可以实现进程间通信,但是他们的作用或者说使用的方向是有明显的区别的:

1:共享内存是创建一块内存区域,多个进程可以同时访问该区域,一般用于进程间数据传输,效率比较明显基运兄。

2:信号量则完全不同,信号量主要是用来控制临界资源的访悄嫌问,也就是你说的不能并行的函数/代码。

3:说一下实现,共享内存直接用API就可以了,信号量一般会进行封装,类似于对链表的操作进行一些简单的函数封装一样,下面给出信号量的使用实例代码,可以参考:

sem_ctl.c文件内容:

int init_sem(int sem_id,int init_value)

{

union semun sem_union;

sem_union.val = init_value;

if(semctl(sem_id,0,SETVAL,sem_union) == -1)

{

perror(“semctl”);

return -1;

}

return 0;

}

int del_sem(int sem_id)

{

union semun sem_union;

if(semctl(sem_id,0,IPC_RMID,sem_union) == -1)

{

perror(“delete semaphore”);

return -1;

}

return 0;

}

int sem_p(int sem_id)

{

struct sembuf sem_b;

sem_b.sem_num = 0;

sem_b.sem_op = -1;

sem_b.sem_ = SEM_UNDO;

if(semop(sem_id,&sem_b,1) ==-1)

{

perror(“P operation”);

return -1;

}

return 0;

}

int sem_v(int sem_id)

{

struct sembuf sem_b;

sem_b.sem_num = 0;

sem_b.sem_op = 1;

sem_b.sem_ = SEM_UNDO;

if(semop(sem_id,&sem_b,1) == -1)

{

perror(“V opration”);

return -1;

}

return 0;

}

sem_ctl.h文件内容搏袭:

#include

#include

#include

#include

#include

#include

#include

#define MAX 128

int count; //全局变量,即临界资源

union semun{

int val;

struct semid_ds *buf;

unsigned short *array;

struct seminfo *__buf;

};

int init_sem(int sem_id,int init_value);

int del_sem(int sem_id);

int sem_p(int sem_id);

int sem_v(int sem_id);

在应用程序中只要包含sem_ctl.h就可以使用信号量的p、v操作了,下面给出2个c程序同时操作该信号量的情况,类似于:

server.c文件内容如下:

#include “util.h”

#include

int semid;

void sighandler(int signo)

{

del_sem(semid);

exit(0);

}

void server()

{

key_t key;

initcount();

if((key = ftok(“.”,’e’)) == -1)

{

perror(“ftok”);

exit(1);

}

if((semid = semget(key,1,0666|IPC_CREAT|IPC_EXCL)) == -1)

{

perror(“semget”);

exit(1);

}

printf(“the semid is :%d\n”,semid);

init_sem(semid, 0);

signal(SIGINT,sighandler);

signal(SIGUSR1,sighandler);

signal(SIGALRM,sighandler);

while(1)

{

sem_p(semid);

/* do something */

printf(“count =%d\n”,count++);

sem_v(semid);

sleep(2);

}

}

int main(void)

{

server();

}

client.c文件内容如下:

#include “sem_ctl.h”

void custom()

{

int semid;

key_t key;

if((key = ftok(“.”,’e’)) == -1)

{

perror(“ftok”);

exit(1);

}

if((semid = semget(key,0,0)) == -1)

{

perror(“semget”);

exit(1);

}

printf(“the semid is :%d\n”,semid);

while(1)

{

sem_p(semid); //获得信号量,同一时间只有一个进程能获得该信号量

/* do something */

printf(“count =%d\n”,count++);

sem_v(semid); //释放信号量

sleep(2);

}

}

int main(void)

{

custom();

}

编译好,运行的时候先运行server再运行client。

关于linux c 信号量的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

香港服务器首选树叶云,2H2G首月10元开通。
树叶云(shuyeidc.com)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/179141.html<

(0)
运维的头像运维
上一篇2025-03-26 10:20
下一篇 2025-03-26 10:21

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注