gpt4 book ai didi

c - shmat 返回段错误(核心已转储)

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:03:33 26 4
gpt4 key购买 nike

我试图写入共享内存,但出于某种原因,在我调用 shmat() 和 strcpy 后出现段错误(核心已转储),这是为什么?

这是我的代码:

int fd,shmid;
key_t shmkey;
char *shm_add;
pid_t pid,pid1=0,pid2=0;

shmkey=ftok("shmdemo.c",'j');
if ( shmkey == (key_t)-1 )
{
printf("main: ftok() for shm failed\n");
return -1;
}
shmid=shmget(shmkey, 50, 0666 | IPC_CREAT | IPC_EXCL);
if (shmid == -1)
{
printf("main: shmget() failed\n");
return -1;
}
shm_add=(char *)shmat(shmid,0,0);
if ( shm_add==NULL )
{
printf("main: shmat() failed\n");
return -1;
}

strcpy(shm_add,"hello");

编辑:我在目录中有文件名 shmdemo.c,shmget 的错误号说“文件存在”,但是当我从目录中删除“shmdemo.c”时,ftok 中出现一个新的错误号,说“不存在”这样的文件或目录”。

谢谢你,阿萨夫。

最佳答案

回答各种评论。当你打电话时:

shmget(..., IPC_CREAT | IPC_EXCL);

你用标志说的是:为这个键创建一个共享内存段,并且确保没有共享内存段已经存在与那个键。

如果你只使用:

shmget(..., IPC_CREAT);

你的意思是:如果一个共享内存段已经存在有这个键,返回它; 否则为此 key 创建一个新 key 并返回它。

通常,您可能不希望调用的第二个变体。如果不添加您自己的任何不确定性,并发就已经足够困难了。 (即让一堆协作进程中的任何一个先创建共享内存;而不是指定一个“所有者”进程。)

在使用第一次调用时,如果给定键处已存在共享内存段,系统调用将失败并返回 errnoEEXISTS。 SysV IPC 是持久的,所以它们不会在程序退出后自动清理,比如文件描述符。 (事实上​​,它们更类似于临时文件。)

你应该在你的程序中使用 shmctl(shmid, IPC_RMID, NULL); 之类的东西来清理它们.您还可以使用 ipcs 检查杂散的 IPC 对象并用 ipcrm 删除留下的那些或 cleanipcs .

关于c - shmat 返回段错误(核心已转储),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16636431/

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