问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何用C语言实现采用共享内存的进程间通信

发布网友 发布时间:2022-04-24 16:30

我来回答

2个回答

懂视网 时间:2022-04-20 01:04

前面介绍了php实现共享内存的一个函数shmop,也应用到了项目中,不过shmop有局限性,那就是只支持字符串类型的;sem经过我的测试,是混合型,支持数组类型,可以直接存储,直接获取,少了多余的步骤格式转换。不过sem有大小限制,shmop可以设置很大很大很大~~~不过也可以再php.ini修改相关配置。

<?php
$key = 0x4337b124; 
$shar_key = 1;
// 创建一个共享内存
$shm_id = shm_attach($key, 1024, 0666); // resource type
if ($shm_id === false) {
 die('Unable to create the shared memory segment' . PHP_EOL);
}
//设置一个值
shm_put_var($shm_id, $shar_key, 'test');
//删除一个key
shm_remove_var($shm_id, $shar_key);
//获取一个值
$value = shm_get_var($shm_id, $shar_key);
var_dump($value);
//检测一个key是否存在
var_dump(shm_has_var($shm_id, $shar_key));
//从系统中移除
shm_remove($shm_id);
//关闭和共享内存的连接
shm_detach($shm_id);

注意:$shar_key 只能是 int 型的参数。

详细说明

shm_attach

打开建立共享内存空间。

语法: int shm_attach(int key, int [memsize], int [perm]);

返回值: 整数

函数种类: 操作系统与环境

内容说明: 本函数用来打开或者建立共享内存空间。参数 key 为这部分的键。参数 memsize 可省略,表示所需最小的内存空间 (单位为 byte 位组),默认值在 php3.ini 或 php.ini 中的 sysvshm.init_mem 配置,若无配置则为 10000 bytes。参数 perm 亦可省略,为该内存空间的使用权限,默认值为 666。返回值为共享内存的ID 值,可供程序使用。

shm_detach

中止共享内存空间链接。

语法: int shm_detach(int shm_identifier);

返回值: 整数

函数种类: 操作系统与环境

内容说明: 本函数用来中止与共享内存空间的链接。参数 shm_identifier 即为欲停止部分的共享内存 ID 值。

shm_remove

清除内存空间。

语法: int shm_remove(int shm_identifier);

返回值: 整数

函数种类: 操作系统与环境

内容说明: 本函数用来清除共享内存空间的所有资料。参数 shm_identifier 即为欲停止部分的共享内存 ID 值。

shm_put_var

加入或更新内存空间中的变量。

语法: int shm_put_var(int shm_identifier, int variable_key, mixed variable);

返回值: 整数

函数种类: 操作系统与环境

内容说明: 本函数可用来增加或者修改内存空间中变量值。参数 shm_identifier 为欲增加修改的共享内存 ID 值。参数 variable_key 为欲增加修改的变量名称键。参数 variable 为变量的内容,变量的类型可以是倍精确数 (double)、整数 (integer)、字符串 (string) 或者是数组 (array)。

shm_get_var

取得内存空间中指定的变量。

语法: mixed shm_get_var(int shm_identifier, int variable_key);

返回值: 混合类型资料

函数种类: 操作系统与环境

内容说明: 本函数可用来取得内存空间中指定的变量值。参数 shm_identifier 为欲取得的共享内存 ID 值。参数 variable_key 为欲取得的变量名称键。返回值即为指定变量键的值。

shm_remove_var

删除内存空间中指定的变量。

语法: int shm_remove_var(int id, int variable_key);

返回值: 整数

函数种类: 操作系统与环境

内容说明: 本函数可用来删除内存空间中指定的变量值。参数 shm_identifier 为欲除去的共享内存 ID 值。参数 variable_key 为欲删除的变量名称键。

更多PHP知识,请访问PHP中文网!

热心网友 时间:2022-04-19 22:12

共享内存的函数有以下几个:
(1)int shmget(key_t key, int size, int shmflg),开辟或使用一块共享内存。
(2)void *shmat(int shmid, const void *shmaddr, int shmflg), 将参数shmid所指向的共享内存与当前进程连接。
当使用某共享内存时,需要先使用shmat,达成连接。
(3)int shmdt(const void *shmaddr),将先前用shmat连接的共享内存与当前进程解除连接。参数shmaddr为shmat返回的共享内存的地址。
在完成对共享内存的使用后,需要使用shmdt解除连接。
(4)int shmctl(int shmid, int cmd, struct shmid_ds *buf),控制内存的操作。当cmd为IPC_RMID时,删除shmid所指的共享内存。
这些函数的表头文件为<sys/ipc.h>和<sys/shm.h>

下面给出一个使用共享内存实现进程间通信的例子:进程A开辟一块新的共享内存,进程B修改这个共享内存,进程C打印输出这个共享内存的内容,进程D删除这个共享内存。
进程BCD运行的命令格式为:命令 共享内存ID,如./output 123432。
进程A代码如下:
int main()
{
int shmid;
shmid = shmget(IPC_PRIVATE, SIZE, IPC_CREAT | 0600);
if (shmid < 0)
{
perror("shmget error");
exit(1);
}
printf("create shared memory OK. shmid=%d/n", shmid);

return 0;
}

进程B代码如下:
int main(int argc, char *argv[])
{
int shmid;
char *shmaddr;
if (argc != 2)
{
perror("argc error/n");
exit(1);
}

shmid = atoi(argv[1]);
shmaddr = (char *)shmat(shmid, NULL, 0);
if ((int )shmaddr == -1)
{
perror("shmat error./n");
exit(1);
}

strcpy(shmaddr, "hello, world!");

shmdt(shmaddr);

return 0;
}

进程C代码如下:
int main(int argc, char *argv[])
{
int shmid;
char *shmaddr;
if (argc != 2)
{
printf("argc error/n");
exit(1);
}

shmid = atoi(argv[1]);
shmaddr = (char *)shmat(shmid, NULL, 0);
if ((int )shmaddr == -1)
{
perror("shmat error./n");
exit(1);
}

printf("%s/n", shmaddr);

shmdt(shmaddr);

return 0;
}

进程D代码如下:
int main(int argc, char *argv[])
{
int shmid;
if (argc != 2)
{
perror("argc error/n");
exit(1);
}

shmid = atoi(argv[1]);
shmctl(shmid, IPC_RMID, NULL);

return 0;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
王奇 这个名字好不好 城建税等计入什么科目 灭火器多久保养一次 灭火器保养周期是多久? 朋友在北京想开一家超市的,请问什么地方适合?还有前期要准备什么? 恐龙宝宝漫游记之我爱我家2内容提要 我爱我家艳红为什么离婚 Faudel演唱的法语歌曲mon pays 的中文歌词,哈哈哈哈,谁有 Shy'm的Le blues de toi 歌词意思 ...那个t后面省略了什么 还有,希望能帮我翻译一下以下的歌词_百度... 地下城堡2小米版安卓APK如何下载 永远爱你的句子 怎么爱你都不嫌多,是什么歌。 银华日利持有一天可以分红吗 linux下c语言如何对共享内存进行写操作?其中key是固定的,需要创建共享内存,然后进行写操作。 爱你的永远都爱你。不会嫌弃你,不会离开你的对吗? 我爱你李再玲这辈子我都要和你在一起英语翻译 共享内存的初始化 爱我你就不会离开 说说 歌词中有一句我爱你我爱你,最后一句歌词是爱上你我永远都不后悔。男的唱的, linux c 信号量与共享内存问题 多客户端同时接受消息 进程间通信 内存映射和共享内存的区别 爱你永远不孤单应改成爱你永恒不孤单 一生爱你永远不变撒意思 怎么在linux下C语言中将结构体写入共享内存 爱你永远不离开 linux c共享内存的使用。。共享内存追加数据 你能保证爱你的一辈子都爱你永远不变吗? c 语言 共享内存里有二维字符数组怎么操作 一个女人对一个男人说爱你永远不变,但我不会打扰你了,这话是什么意思? C++建立两个内存缓冲区 通过多线程共享内存进行读写 清洁空气与疾病防控为主题的绘画作品有哪些? 大师们,JNI能让Java和C/C++共享内存吗 我要爱你一生一世永远不分开 用英语说?? 汽车电瓶充电器上的60AH是什么意思 六年级消灭病毒生物,预防春季各类传染病的画画怎么画 C语言中关于联合体的数据存放问题 虽然不能在一起,但是永远爱你的经典句子 预防疾病的绘画,该画什么我不知道,请赐予我灵感吧 C语言共同体问题 汽车电瓶充电器用20安好还是150安好? 怎么写预防夏季传染病的美术字 新买的万家乐燃气热水器智能恒温的十二升的,为什么在洗澡过程中会突然有冷水出来 汽车电瓶充电器选多少安的整流模块 2019年昭通特岗模拟真题 12V60Ah汽车电瓶充电要调几安? 万家乐燃气热水器8升,10升,12升,分别可以出多少斤水,拜求各位大神指点。 我1980年农历8月24日生的,帮忙给算一下. 12伏汽车电瓶充电器用多少a合适? 律师执业证怎么办 不会画画可以学纹眉吗