Linux--信号量共享内存
创始人
2024-02-16 09:55:50
0

1.基础知识:

(1)共享内存是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间的数据传递不再涉及内核,即进程不再通过执行进入内核的系统调用来传递彼此的数据。

(2)共享内存的生命周期随内核。

(3)注意:共享内存未提供任何保护资源,即共享内存自身没有同步与互斥机制,但它是临界资源,所以我们需要利用其它机制来保证数据的正确性,Linux下就可以用信号量达到同步的目的。

(4)linux共享内存有两种方式(本文主要介绍shmget方式):

                1)mmap方式,适用于父子进程之间,创建的内存非常大时;

                2)shmget方式,适用于同一台电脑上不同进程之间,创建的内存相对较小。

(5)进程间利用共享内存实现消息队列的基本原理如下图

 2.相关函数

1.semget

 

1.函数原型

2.函数功能

创建或者获取一个已经存在的信号量;

如果为全新创建,也就是不知道是否有人创建过,则IPC_CREATE|IPC_EXCEL,就是如果没

有则创建,如果有则创建失败 ;

3.参数

key:两个进程使用相同的key值,就可以使用同一个信号量;

nsems:创建几个信号量;

semflg:标志位;如果为创建:IPC_CREAT;

4.返回值

成功返回一个非负整数即该信号集的标识码;失败返回-1

2.semop

1.函数原型

2.函数功能

对信号量进行改变,做P操作或者V操作;

3.参数

semid:信号量的id号,也就是刚才semget的返回值;说明对哪个信号量进行操作;

sops:结构体指针,指向sembuf的结构体指针,sembuf结构体有三个成员变量:sem_num表

示信号量的编号(即指定信号量集中的信号量下标);

nsops:表示是p还是v操作;1为v操作 (加1),-1为p操作(减1);sem_flg为标志位;

4.返回值

成功返回0;失败返回-1

5.说明

unsigned short sem_num;  /* semaphore number */第几个信号量
short          sem_op;   /* semaphore operation */p(-1)操作还是v操作(+1)
short          sem_flg;  /* operation flags */标志位

3.semctl

1.函数原型

**注意**:联合体semun,这个联合体需要自己定义; 

2.函数功能

控制信号量集 对信号量进行控制:初始化/删除信号量

3.参数

semid:信号量id;  由semget函数返回的信号量集标识码

semnum:信号量编号; 信号量集中信号量的序号

cmd:命令:SETVAL:初始化信号量; IPC_RMID:删除信号量; 将要采取的动作(有三个可取值)

4.返回值

成功返回0,失败返回-1

3.思路:

 

4.代码

1. sem.h

#include
#include
#include 
#include 
#include union semun
{int val;
};void sem_init();
void sem_p(int index);
void sem_v(int index);
void sem_destroy();

2.sem.c

#include "sem.h"
#define  SEM_NUM  2
static int semid = -1;
void sem_init()
{semid = semget((key_t)1234,SEM_NUM,IPC_CREAT|IPC_EXCL|0600);//全新创建if (semid == -1 ){semid = semget((key_t)1234,SEM_NUM,0600);if ( semid == -1){printf("semget err\n");return;}}else{int arr[SEM_NUM] = {1,0};for( int i = 0; i < SEM_NUM; i++ ){union semun a;a.val = arr[i];if ( semctl(semid,i,SETVAL,a) == -1 )//全新创建成功,就初始化{printf("semctl err\n");}}}
}
void sem_p(int index)
{if ( index < 0 || index >= SEM_NUM ){return;}struct sembuf buf;buf.sem_num = index;buf.sem_op = -1;//pbuf.sem_flg = SEM_UNDO;if ( semop(semid,&buf,1) == -1 ){printf("sem p err\n");}
}
void sem_v(int index)
{if ( index < 0 || index >= SEM_NUM ){return;}struct sembuf buf;buf.sem_num = index;buf.sem_op = 1;//vbuf.sem_flg = SEM_UNDO;if ( semop(semid,&buf,1) == -1 ){printf("sem v err\n");}
}
void sem_destroy()
{if ( semctl(semid,0,IPC_RMID) == -1 ){printf("semctl del err\n");}
}

3.a.c

#include 
#include 
#include 
#include 
#include 
#include "sem.h"
int main()
{int  shmid = shmget((key_t)1234,256,0600|IPC_CREAT);//创建/获取共享内存if ( shmid == -1 ){printf("shmget err\n");exit(0);}char* s = (char*)shmat(shmid,NULL,0);if ( s == (char*)-1 ){printf("shmat err\n");exit(0);}sem_init();//2  1,0while( 1 ){printf("input\n");char buff[128] = {0};fgets(buff,128,stdin);sem_p(0);strcpy(s,buff);sem_v(1);if ( strncmp(buff,"end",3) == 0 ){break;}}shmdt(s);exit(0);
}

4.b.c

#include 
#include 
#include 
#include 
#include 
#include "sem.h"
int main()
{int  shmid = shmget((key_t)1234,256,0600|IPC_CREAT);//创建/获取共享内存if ( shmid == -1 ){printf("shmget err\n");exit(0);}char* s = (char*)shmat(shmid,NULL,0);if ( s == (char*)-1 ){printf("shmat err\n");exit(0);}sem_init();//2  1,0while( 1 ){printf("input\n");char buff[128] = {0};fgets(buff,128,stdin);sem_p(0);strcpy(s,buff);sem_v(1);if ( strncmp(buff,"end",3) == 0 ){break;}}shmdt(s);exit(0);
}

 

 只运行b.c,会阻塞

相关内容

热门资讯

进入高三励志标语 进入高三励志标语(精选180句)  在日常的学习、工作、生活中,大家最不陌生的就是标语了吧,标语在一...
大学毕业班级鉴定评语 大学毕业班级鉴定评语(精选120条)  无论是身处学校还是步入社会,大家都有写评语的经历,对评语很是...
中考横幅标语大全   1.春播秋收近十载,一朝收获终有成。  2.不论你在什么时候开始,重要的是开始之后不要停止。  ...
学校六一活动标语 学校六一活动标语(精选50句)  在现实生活或工作学习中,大家对标语都再熟悉不过了吧,标语以其时间性...
家装实木高档油漆门广告语 家装实木高档油漆门广告语  1、一“门”心思只为您。  2、打开木门,开启幸福。  3、独门工艺,专...
厕所文明标语 厕所文明标语(通用185句)  在现实生活或工作学习中,大家都对那些朗朗上口的标语很是熟悉吧,标语是...
宣传稿格式 宣传稿格式  一、宣传稿的介绍  首先,新闻宣传稿要重视宣传的本身意义和作用。  其次,要懂得如何在...
校园文明标语 校园文明标语  在学习、工作、生活中,大家都接触过比较经典的标语吧,标语的作用是便于“造势”,形成一...
打折促销标语 打折促销标语大全  XX真情回馈理惠X折  终极X小时终极抄底价  心动,不如行动!  不做不休用暴...
最新学习小组口号 最新学习小组口号  在日常的学习、工作、生活中,大家都经常接触到口号吧,口号作为意识的表现形式之一,...
垃圾分类标语 垃圾分类标语(精选140句)  在平时的学习、工作或生活中,大家最不陌生的就是宣传语了吧,宣传语具有...
安全生产横幅标语口号 安全生产横幅标语口号大全  ●安全人人抓,幸福千万家  ●安全生产 人人有责  ●安全生产 重在预防...
迎新的标语 迎新的标语(精选150句)  在日常学习、工作和生活中,大家都接触过比较经典的标语吧,标语不但折射着...
2022年村委会普法宣传简报 2022年村委会普法宣传简报  一、村委会相关介绍  村委会的全称为村民委员会,为中国大陆地区乡(镇...
广告公司广告语 广告公司广告语大全  广告公司广告语大全广告语指通过各种传播媒体和招贴形式向公众介绍商品、文化、娱乐...
经典安全标语 经典安全标语大全  导语:安全是宝藏,安全是生命,安全是金钱。下面是由小编为你整理的经典安全标语大全...
奶茶广告语 奶茶广告语大全  广告,顾名思义,就是广而告之,向社会广大公众告知某件事物。那么奶茶店的广告又该是怎...
2班军训押韵口号_口号 2班军训押韵口号_口号  无论在学习、工作或是生活中,说到口号,大家肯定都不陌生吧,口号是供口头呼喊...
煤矿安全生产的标语 煤矿安全生产的标语(通用255句)  标语是指:文字简练、意义鲜明的宣传、鼓动口号。标语是用简短文字...
光盘行动标语 关于光盘行动标语(精选100句)  在平凡的学习、工作、生活中,许多人对一些广为流传的标语都不陌生吧...