Pourquoi shmat () ne peut-il pas accéder à mon segment de mémoire partagée? (ERRNO 13)

Pour un projet UNIX / C, je suis supposé allouer deux segments de mémoire partagée (dont les processus enfants accèderont éventuellement avec des droits en lecture seule et en écriture, respectivement) de deux entiers chacun. Mais chaque fois que j’essaie d’appeler shmat (3), il finit par retourner -1, définissant errno à EACCES, indiquant apparemment des permissions insuffisantes. J’ai produit ce qui semble être le code minimum requirejs pour l’erreur ci-dessous, avec éventuellement un couple supplémentaire comprend:

#define _SVID_SOURCE #include  #include  #include  #include  #include  #include  int main(int argc, char *argv[]){ int i, j, shmid, tshmid; int * clock; int * shmMsg; tshmid = shmget(IPC_PRIVATE,sizeof(int)*2, IPC_CREAT | IPC_EXCL | 0777); //0777 permissions are more liberal than I need, but I've sortinged other various literals and numbers as well as just CREAT/EXCL. if (tshmid < 1){ printf("Error: In parent process (%d), shmid came up %d \n",getpid(),shmid); exit(-1); } clock = (int *) shmat(shmid,NULL,0); //I've also tried this with the second argument as (void *) 0, and with the third argument as "(SHM_R | SHM_W)" and "0777" if (clock == (void *) -1){ printf("Error: First shmat couldn't shmattach to shmid #%d. ERRNO %d\n",shmid,errno); shmdt(clock); exit(-1); } //it never even gets this far shmdt(clock); } 

A chaque fois, cela génère un message d’erreur tel que:

Erreur: premier shmat ne pouvait pas shmattach shmid # 1033469981. ERRNO 13

La version la plus longue de mon programme a initialement renvoyé une erreur identique, mais errno a été défini sur 43 (EIDRM: le segment identifié par shm_id a été supprimé). J’ai récursivement chmodded le répertoire entier à plein access, de sorte que ce n’est pas le problème, et chaque fois que mon programme plante, je dois désallouer manuellement la mémoire partagée en utilisant ipcrm, donc les shmids s’appliquent aux segments réels. Pourquoi ne pas l’attacher?