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
有什么问题?
答案 0 :(得分:0)
只是一个小小的猜测,但ftok手册页说
ftok()函数使用由给定路径名命名的文件的标识(必须引用现有的可访问文件)和proj_id的最低8位(必须非零 )生成key_t类型的System V IPC密钥,适用于msgget(2),semget(2)或shmget(2)。
你获得相同标记的原因可能是你将它传递给零?