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
В чем проблема?
Похоже, вы используете один и тот же ключ. Третий аргумент вашей функции - это одно значение - 'char f'. Вы имели в виду 'char * f' (обратите внимание на' * ')? Похоже, вы повторно используете один и тот же ключ. Третий аргумент вашей функции - это одно значение - 'char f'. Вы имели в виду 'char * f' (обратите внимание на' * ')? – cegfault
sprintf сделать это char * –
Я видел это; Я имею в виду, что имя файла всегда будет только одним символом - вы, вероятно, захотите передать полное имя файла – cegfault