2015-01-09 2 views
0
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

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

+0

sprintf сделать это char * –

+0

Я видел это; Я имею в виду, что имя файла всегда будет только одним символом - вы, вероятно, захотите передать полное имя файла – cegfault

ответ

0

Просто небольшая догадка, но страница ftok руководство говорит

ftok() функция использует идентификатор файла с именем в заданном пути (который должен ссылаться на существующий, доступный файл) и наименее значимые 8 бит proj_id (, который должен быть отличным от нуля), чтобы сгенерировать ключ ключа Key_t System V IPC, подходящий для использования с msgget (2), semget (2) или shmget (2).

Возможно, причина, по которой вы получаете тот же токен, состоит в том, что вы передаете ему нуль?

+0

, когда я передам ему ненулевое значение: Создание нового сегмента разделяемой памяти Существует сегмент общей памяти - открытие как клиент bad shmget: Нет такого файла или каталога –

+0

Хммм ... Вы должны проверить, что ключ не равен -1, и вы не должны предполагать, что единственной причиной отказа первого shmget является то, что сегмент уже существует. –

+0

Я добавил, что ключ не равен -1, тот же вывод. –

Смежные вопросы