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

linux共享内存会不会被编译器优化

发布网友 发布时间:2022-05-01 19:45

我来回答

1个回答

热心网友 时间:2022-06-22 03:44

利用共享内存(Share Memory)可以让我们在任意两个进程之间传递数据,而且也是相对容易实现的一种方法,在正常情
况下,一个进程所使用的内存是不允许其它进程访问的,但是通过共享内存可以实现数据的共享。
使用共享内存用到的API函数有:

# include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

key_t ftok(const char *pathname, int proj_id)

其中pathname为当前进程的程序名,第二个参数为进程所开辟的第几个共享内存,返回一个key_t值,用于共享内存的获取
使用。

int shmget(key_t shmkey, int shmsiz, int flag)

void *shmat(int shmid, char *shmaddr, int shmflag)

int shmdt(char *shmaddr)

shmget是用来创建或者指向一块共享内存的函数,其中shmkey是共享内存的标识符,如果父子关系的进程间通信的话,这
个标识用IPC_PRIVATE替代,如果没有任何关系,可以使用ftok计算出来;Shmsiz是这块内存的大小;flag是这块内存的模
式和权限标识(IPC_CREAT, IPC_ALLOC, IPC_EXCL,0666权限)。函数成功返回共享内存的shmid,否则返回-1表示失败。

Shmat用来允许进程访问共享内存的函数,其中shmid是共享内存的ID,shmaddr是共享内存起始位置,shmflag是本进程对
内存操作模式,SHM_RDONLY是只读模式,成功返回共享内存的起始位置。

Shmdt与shmat相反,是用来禁止进程访问一块共享内存的函数。

int shmctl(int shmid, int cmd, struct shmid_ds *buf)

其中shmid是共享内存的ID,cmd是控制命令(IPC_STAT, IPC_SET, IPC_RMID),struct shmid_ds *buf是一个结构体指针
,如果要改变共享内存的状态,使用它来指定,获得状态就存放在这个结构体中。

上述API函数的详细说明请使用man(男人)查看:

# man shmget | shmat | shmdt | shmctl

下面使用一个简单的例子说明如何使用共享内存。

// sharememcut.c 拷贝用户输入的字符串到共享内存中

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

#include <stdio.h>

int main()

{

key_t shmkey;

int shmid, in_tmp;

char *head, *pos, in_data[4096], *in_ptr;

// Create share memory KEY

shmkey = ftok("sharememcut", 1);

// Get the share memory ID

shmid = shmget(shmkey, sizeof(in_data), IPC_CREAT | 0666);

// Allow the process to access share memory, and get the address

head = pos = shmat(shmid, 0, 0);

in_ptr = in_data;

// Receive the character from stdin, 'q' to quit

while ((in_tmp = getchar()) != 'q') {

*in_ptr = in_tmp;

in_ptr++;

}

*in_ptr = '\0';

in_ptr = in_data;

// Cut the data into share memory

while (*in_ptr != '\0') {

*pos++ = *in_ptr++;

}

// Prohabit the process to access share memory

shmdt(head);

return 0;

}

# gcc -o sharememcut sharememcut.c 编译sharememcut.c

# ./sharememcut 执行sharememcut创建共享内存



# ipcs -m | grep 4096 查看创建的共享内存

0x01068288 348848145 root 666 4096 0

// sharemempaste.c 将共享内存的内容显示在屏幕上并且删除共享内存

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

#include <stdio.h>

int main()

{

key_t shmkey;

int shmid;

char *head, *pos, out_data[4096], *out_ptr;

// Create share memory KEY

shmkey = ftok("sharememcut", 1);

// Get the share memory ID

shmid = shmget(shmkey, sizeof(out_data), 0666);

if (shmid == -1)

return -1;

// Allow the process to access share memory, and get the address

head = pos = shmat(shmid, 0, 0);

out_ptr = out_data;

// Get the data from share memory

while (*pos != '\0') {

*out_ptr++ = *pos++;

}

*out_ptr = '\0';

// Output the data into stdout

printf("%s\n", out_data);

fflush(stdout);

// Prohabit the process to access share memory

shmdt(head);

// Delete the share memory

shmctl(shmid, IPC_RMID, NULL);

return 0;

}

# gcc -o sharemempaste sharemempaste.c 编译sharemempaste.c

# ./sharemempaste 执行程序显示共享内存的内容
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
纯种萨摩和不纯的萨摩的区别 不是纯种萨摩,长大成型后和纯种萨摩外表一样吗 学播音主持和配音哪个更赚钱,各有各的长处 学播音真的能改变声音吗,会让自己的普通话更加标准 学习播音和配音的作用,可以提升自信和气质 普通人学配音有没有用,有兴趣则有用 什么是永诚财产保险股份有限公司 win10电脑升级不了ie11win10怎么升级ie11 电脑硬件保修哪些电脑硬件保修包括什么 电脑固态硬盘质保几年一般的电脑保修时间是多久 Linux进程间如何共享内存 中国人保的农业保险 linux共享内存的绑定脱离 今天的新闻作文300字 “今天真痛快”300字作文 今天搬煤球作文300字以上 Linux编程求救,共享内存编程忘了删除了,以后再编译执行程序就一直出现shmget id error!,该怎么做? 把握今天为题目的300字作文!! linux在终端怎么取消shmat的共享内存 今天我当家作文 300字 农业保险有哪些公司 linux命令怎么删除共享内存 怎么写300字的作文 如何看待今天作文300字 我们今天的幸福 作文300字 德国骆驼的品牌精神是什么呢? 今天我在干什么作文300字 美国骆驼和德国骆驼有什么区别 德国骆驼的介绍 北京的三网通群发平台哪家好些? D小调音阶和弦 女士运动裤配什么上衣好看 钢琴d小调一四五级和弦是什么? d小调的和弦 d小调的一级四级五级和弦是什么?d小调的还有属七和弦是什么?求大神帮帮忙? 运动裤怎么搭配衣服女 D小调的正三和弦有哪几个? 钢琴d小调 写出 D自然大小调的和弦和名称 F自然大小调的和弦和名称! 求详细 请问下 升d和声小调音阶?谢谢! d小调音阶是什么? d自然小调音阶是什么? d小调的升do怎么配和弦? D小调音阶要升什么,从哪个音到哪个音 各个大调和小调的主音分别是什么 D小调的下属和弦与属和弦是什么? DM小调和D小调哪种叫法是正确的?还是都可以这样讲? 潮塑包装设计有什么特别的地方? SOAP模式中难度最大的是 什么是SOAP?