我在 Linux 中使用共享内存(没有多个进程(编写了一个简单的 c 程序,因为我在完整程序中遇到了"分段错误"。
我仍然收到同样的错误。我做错了什么?
谢谢!
#include<stdio.h>
#include<stdlib.h>
#include<sys/shm.h>
#include<sys/ipc.h>
#include<sys/types.h>
void sys_err(char s[])
{
perror(s);
exit(1);
}
int main(int argc, char *argv[])
{
int shmid, *shmptr, *ptr;
if(shmid = shmget(IPC_PRIVATE, (10)*sizeof(int), 0666|IPC_CREAT)<0)
sys_err("Cannot shmget");
if((shmptr=(int*)shmat(shmid,0,0))<(int*)0)
sys_err("Cannot shmat");
shmptr[0]=1; // <----- error: "Segmentation fault (core dumped)"
//OR
*shmptr=1; // <----- error: "Segmentation fault (core dumped)"
//OR
ptr=shmptr; // <----- error: "Segmentation fault (core dumped)"
*ptr=1;
if(shmdt(shmptr)<0)
sys_err("Cannot shmdt");
shmctl(shmid,IPC_RMID,0);
return 0;
}
我最终发现了问题。其实很小。
在这一部分中:
if(shmid = shmget(IPC_PRIVATE, (10)*sizeof(int), 0666|IPC_CREAT)<0)
sys_err("Cannot shmget");
缺少"(("来包围孔表达式,如下所示:
if((shmid = shmget(IPC_PRIVATE, (10)*sizeof(int), 0666|IPC_CREAT))<0)
sys_err("Cannot shmget");
现在它运行了。谢谢!