gpt4 book ai didi

c - 第二个 shmget 总是返回拒绝访问

转载 作者:太空宇宙 更新时间:2023-11-04 03:43:05 24 4
gpt4 key购买 nike

我正在尝试创建两组共享内存段。一个用于存储整数,另一个用于存储字符串。当我为我的整数创建共享内存段时,我在第二次 shmget 调用中不断收到错误消息。

 keyS=5678;
keyI=6789;
//create shared memory for titles and categories
if(stringsID=shmget(keyS,sizeof(char*)*lineCounter*2,IPC_CREAT|0666)<0)
{
perror("shmget");
fprintf(stderr, "Titles Cannot create shared memory errno %i: %s\n",errno,strerror(errno));

exit(-1);
}

//attach to shared memory
if ((titlesSH = (char**)shmat(stringsID, NULL, 0)) ==(char**) -1)
{
perror("shmat");
exit(1);
}

//titles start at titlesSH[0] while categories start at titlesSH[lineCounter]
categoriesSH=titlesSH+lineCounter;


//create shared memory for stock and codes
if(intsID=shmget(keyI,sizeof(int)*lineCounter*2,IPC_CREAT|0666)<0)
{
perror("shmget");
fprintf(stderr, "Stock Cannot create shared memory errno %i: %s\n",errno,strerror(errno));

exit(-1);
}
//attach to shared memory
if((stockSH=(int*)shmat(intsID,NULL,0))==(int*)-1)
{
perror("shmat");
exit(-1);
}

当我在终端中运行 ipcs 时,我发现没有带有我在代码中指定的 key 的 ipc,但我尝试了不同的 key ,结果始终相同。我做错了什么吗?

当我调用 shmget 时,我尝试从特权中删除 0666,它确实停止了(shmget 不返回 -1),让我的复制内容但是当我尝试从中获取内容时出现段错误。

如果我删除额外的共享内存段并只保留一个,则一切正常。我知道有一个解决方法(将所有内容作为字符串存储在一个更大的内存段中)但我也想知道为什么会发生这种情况

**编辑我上面提到的解决方法目前有效我将所有信息存储在一个存储字符串的共享内存段中,它的大小是我试图创建的两个段的总和。所以共享内存空间不是问题。 ipcs 只给我 9 个正在运行的 ipc,所以我想在这种情况下,ipc 的限制和空间的限制不是问题

最佳答案


if(stringsID=shmget(keyS,sizeof(char*)*lineCounter*2,IPC_CREAT|0666)<0)
/* and */
if(intsID=shmget(keyI,sizeof(int)*lineCounter*2,IPC_CREAT|0666)<0)

最有可能是:

if( (stringsID=shmget(keyS,sizeof(char*)*lineCounter*2,IPC_CREAT|0666)) < 0)
/* and */
if( (intsID=shmget(keyI,sizeof(int)*lineCounter*2,IPC_CREAT|0666)) <0)

为了演示,

  1. 编译以下程序(您的编译器是否发出任何警告?我的有!)
  2. 运行它
  3. 执行 ls -ltr
  4. 再次运行
  5. 再次执行 ls -ltr

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int main(void) {

int fd;

if (fd=open("omgwtf", O_RDWR|O_CREAT, 0644) < 0) {
fprintf(stderr, "WTF!\n" ); }

fprintf(stderr, "fd=%d\n", fd );

return 0;
}

注意:为了获得更多乐趣,您可以将 O_EXCL 添加到标志中。

关于c - 第二个 shmget 总是返回拒绝访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26958588/

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