#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在下面的程序中是如何工作的?
答案 0 :(得分:1)
您正在使用System V共享内存,这是操作系统提供的工具。
shmget (2)手册的第一行说明,
shmget()返回System V共享内存段的标识符 与参数键的值相关联。
shmat (2)手册的第一行说明,
shmat()附加由shmid标识的System V共享内存段 到调用进程的地址空间。
使用 shmget ,您提供一个密钥并返回一个标识符。使用 shmat ,您可以提供该标识符,并返回您可以使用的地址。有什么令人困惑的?
我怀疑你和我第一次遇到它时的原因一样令我感到惊讶。与大多数系统资源(文件描述符,套接字等)不同,程序终止时不会释放共享内存段。它们保留在那里,随时可以在程序提供适当的标识符时重复使用。
您甚至不需要编写程序来查看它们。看看 ipcs (1)和 ipcrm (1)。
如果你考虑一下,对于某些应用程序,它们必须是持久的。伯克利替代方案 mmap (2)使用文件名用于相同目的。