从一个进程创建多个共享内存段

时间:2015-01-09 21:20:22

标签: c shared-memory

void *sharedmem(int size,int q,char f){
  int shmid;
  int *segptr;
  queue *que;
  key_t key;
  char file[10];

  sprintf(file,"%c",f);
  key=ftok(file,0);
  if((shmid=shmget(key,size,IPC_CREAT|IPC_EXCL|0666))==-1){    
    printf("Shared memory segment exists - opening as client\n");
    if((shmid = shmget(key, size, 0)) == -1){
      perror("bad shmget");
      exit(1);
    }
  }
  else
    printf("Creating new shared memory segment\n");
   if(q){
     if((que = (queue *)shmat(shmid, 0, 0)) == NULL){
       perror("bad shmat");
       exit(1);
     }
     return que;
   }
   else {
     if((segptr = shmat(shmid, 0, 0)) == NULL){
       perror("bad shmat");
       exit(1);
     }
     return segptr;
  }
}

我想将此功能调用5次,是否需要创建5个不同的文件并从中创建密钥?

$touch 1 2 3 4 5

然后发送

for(i=0;i<5;i++){
 sharedmem(1,0,'1'+i);
}

我尝试了但是我得到了这个结果:

Shared memory segment exists - opening as client
Shared memory segment exists - opening as client
bad shmget: No such file or directory

有什么问题?

1 个答案:

答案 0 :(得分:0)

只是一个小小的猜测,但ftok手册页说

  

ftok()函数使用由给定路径名命名的文件的标识(必须引用现有的可访问文件)和proj_id的最低8位(必须非零 )生成key_t类型的System V IPC密钥,适用于msgget(2),semget(2)或shmget(2)。

你获得相同标记的原因可能是你将它传递给零?