C语言 第二个 shmget 始终返回拒绝访问



我正在尝试创建两组共享内存段。一个用于存储整数,另一个用于存储字符串。当我为整数创建共享内存段时,我在第二次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: %sn",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: %sn",errno,strerror(errno));
      exit(-1);
    }
  //attach to shared memory
  if((stockSH=(int*)shmat(intsID,NULL,0))==(int*)-1)
    {
      perror("shmat");
      exit(-1);
    }

当我在终端中运行ipcs时,我看到没有带有我在代码中指定的键的 ipcs,但我尝试了不同的键,结果总是相同的。我做错了什么吗?

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

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

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


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=%dn", fd );
return 0;
}

注意:为了获得额外的乐趣,您可以在标志中添加O_EXCL

最新更新