gpt4 book ai didi

c - Linux 共享内存段故障

转载 作者:可可西里 更新时间:2023-11-01 11:45:31 24 4
gpt4 key购买 nike

我正在学习共享内存并创建了这个示例程序来测试一下

//IPC - Shared Memory

#include<stdio.h>
#include<stdlib.h>
#include<linux/ipc.h>
#include<linux/msg.h>
#include<linux/shm.h>

int main(int argc, char* argv[])
{
printf("setting up shared memory\n");

key_t ipc_key;
int shmid;
int pid;


ipc_key = ftok(".",'b');

if((shmid=shmget(ipc_key, 32, IPC_CREAT|0666))==-1)
{
printf("error creating shared memory\n");
exit(1);
}

printf("shared memory created with id %d\n",shmid);

//fork a child process
pid = fork();
printf("fork result %d\n",pid);
if(pid==0)
{
//child process
//attach the shared memory
int* shm_add_child = (int*)shmat(shmid, 0,0);
printf("child attached to shared mem at address %p\n",(void*)shm_add_child);

while(1)
{
printf("%d\n",*shm_add_child);
printf("a\n");
}

//detach from shm
shmdt(shm_add_child);
}
else
{
//parent process
int* shm_add_parent;

shm_add_parent = (int*)shmat(shmid, 0,0);
printf("parent attached to shared mem at address %p\n",(void*)shm_add_parent);
*shm_add_parent = 10;

sleep(10);

//detach from shm
shmdt(shm_add_parent);
}

//remove shm
shmctl(shmid, IPC_RMID,0);

exit(0);
}

但是,当我运行它时,出现段错误。看来我指向共享内存的指针不对。此外,子进程中的无限期 while 循环也没有打印任何内容。

ankit@ankit-ThinkPad-W530:~/Desktop/week1_tasks$ ./ipc_sharedmem_a 
setting up shared memory
shared memory created with id 5996570
fork result 8703
parent attached to shared mem at address 0xffffffff991aa000
fork result 0
child attached to shared mem at address 0xffffffff991aa000
Segmentation fault (core dumped)

这里出了什么问题?

最佳答案

我不确定您为什么要包括最后三个头文件。它们不是正确的 header ,会给您错误的 shm 函数定义。在我的系统上,gcc 甚至会发出警告,提示存在问题:

test.c:38:26: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
int* shm_add_child = (int*)shmat(shmid, 0,0);
^
test.c:55:22: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
shm_add_parent = (int*)shmat(shmid, 0,0);

相反,您应该只包含 shmat man page 中指定的那些.具体来说:

#include<stdio.h>
#include<stdlib.h>

// Remove these headers
//#include<linux/ipc.h>
//#include<linux/msg.h>
//#include<linux/shm.h>

// Include these instead
#include <sys/types.h>
#include <sys/shm.h>

关于c - Linux 共享内存段故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38388884/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com