J'ai un problème étrange avec la mémoire partagée. La méthode shmget
renvoie -1 et errno
est définie sur EEXIST
. Selon l'homme, cela n'est possible que lorsque les deux indicateurs IPC_EXCL
et IPC_CREAT
sont fournis.EEXIST sans IPC_EXCL sur shmget
Mon code:
int main()
{
int shmid = shmget(0xABCD, MAX_SIZE, IPC_CREAT | 0x660);
int shmid2 = shmget(0xABCD, MAX_SIZE, IPC_CREAT | 0x660);
if(shmid == -1)
{
if(errno == EEXIST)
perror("Error");
return -1;
}
if(shmid2 == -1)
{
if(errno == EEXIST)
perror("Error2");
return -1;
}
shmctl(shmid, IPC_RMID, NULL);
return 0;
}
Il compile avec -Wall sans avertissement préalable, je vérifie avec IPCS si le segment est déjà présent (et l'enlever si nécessaire). La sortie est Error2: File exists
. Il fonctionne quand je change la deuxième shmget à:
int shmid2 = shmget(0xABCD, MAX_SIZE, 0);
Citation de man shmget
:
EEXIST IPC_CREAT | IPC_EXCL was specified and the segment exists.
Et une autre question: est-il vrai que mode_flags (c.-à-0x660) ne sont pas utilisés en essayant de exécuter shmget?
C'est le moment le plus embarrassant qui soit. Comme ... Jamais ... Je ne sais même pas quoi dire pour couvrir ma honte, j'utilise l'octal dans les appels système presque tous les jours ... Merci pour l'aide :) –
@xavier - Sur la longue liste des erreurs de bonehead nous faire dans la vie celui-ci ne sera même pas proche du sommet. Mieux vaut éviter tout cela et utiliser simplement les constantes symboliques, par ex. S_IRUSR, S_IRGRP et ainsi de suite. C'est plus portable et moins de maux de tête. – Duck
@Duck Je ne sais pas à ce sujet, je peux lire et comprendre '0660' a * beaucoup * plus vite que' S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP'. – zwol