【问题标题】:This is regarding shared memory in LINUX这是关于 LINUX 中的共享内存
【发布时间】:2017-01-30 18:29:36
【问题描述】:
#include<sys/shm.h>
#include<sys/stat.h>
#include<stdio.h>
int main(void)
{
int segment_id;
char *shared_memory;
const int size=4069;
segment_id=shmget(IPC_PRIVATE,size,S_IRUSR|S_IWUSR);
printf("segment ID=%d\n",segment_id);
shared_memory=(char *)shmat(segment_id,NULL,0);
sprintf(shared_memory,"Hi There!");
while(1){
}
return 0; 

}

如果在下面程序的输入中输入相同的segment_id,它会起作用吗?

#include<sys/shm.h>
#include<sys/stat.h>
#include<stdio.h>
int main(void)
{
int segment_id;
char *shared_memory;
const int size=4069;
printf("please input segment id\n");
scanf("%d",&segment_id);
shared_memory=(char *)shmat(segment_id,NULL,0);
printf("%s\n",shared_memory );
return 0;
}

它在这里工作,但请解释它是如何工作的,这意味着相同的 segment_id 在下面的程序中也是如何工作的?

【问题讨论】:

    标签: c linux ubuntu memory-management shared-memory


    【解决方案1】:

    您正在使用 System V 共享内存,这是操作系统提供的一种工具。

    shmget(2) 手册的第一行说,

    shmget() 返回 System V 共享内存段的标识符 与参数键的值相关联。

    shmat(2)手册的第一行说,

    shmat() 附加由 shmid 标识的 System V 共享内存段 到调用进程的地址空间。

    使用 shmget,您提供一个密钥,它会返回一个标识符。使用 shmat,您提供该标识符,它会返回您可以使用的地址。这有什么令人困惑的?

    我怀疑您感到惊讶的原因与我第一次遇到它时的原因相同。与大多数系统资源(文件描述符、套接字等)不同,共享内存段在程序终止时不会被释放。它们保留在那里,随时可以在程序提供适当的标识符时被重用。

    您甚至不需要编写程序来查看它们。查看 ipcs(1) 和 ipcrm(1)。

    如果您考虑一下,对于某些应用程序,它们必须是持久的。 Berkeley 替代方案 mmap(2) 使用文件名实现相同目的。

    【讨论】:

    • 我猜@Piotr 想知道为什么用IPC_PRIVATE 创建的共享内存段可以被另一个进程附加。
    • 也许你是对的。该答案也在手册中:IPC_PRIVATE 不是“隐私”模式;这是一个神奇的值,可确保重新创建细分。
    猜你喜欢
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 2012-12-31
    • 1970-01-01
    • 2023-03-11
    • 2014-05-08
    相关资源
    最近更新 更多