2012-09-10 4 views
0

J'essaye d'obtenir ce code fonctionnant mais je ne peux pas. Je parviens à créer un code qui ne montre aucune erreur de compilation ou d'avertissement, mais lorsque je tente de l'exécuter échoue avec cette erreur:semget pas tel fichier ou répertoire

semget: Aucun fichier ou répertoire

Voici mon code:

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/wait.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/shm.h> 
#include <sys/sem.h> 
#include <time.h> 

int main(int argc, char *argv[]) { 
    key_t llave1,llavesem; 
    int idmem,idsem; 
    struct sembuf op;  
    llavesem=ftok("/tmp",'b'); 

    idsem=semget(llavesem,1,0); /* This is the line giving the error*/ 
    if (idsem==-1) { 
     perror ("semget"); 
     return 1; 
    } 

    semctl(idsem,1,SETVAL, &valini); 
    op.sem_num=0; 
    op.sem_flg=0; 

    /*Some code here*/ 

    op.sem_op=-1; 
    semop(idsem,&op,1); 

    /*Some code here*/ 

    op.sem_op=1; 
    semop(idsem,&op,1); 
    semctl(idsem,1,IPC_RMID); 
} 

Si j'inclue le fichier d'en-tête sys/sem.h ... pourquoi le fichier exécutable ne le trouve pas?

Qu'est-ce que je fais mal?

Merci à l'avance et meilleures salutations,

** * ** * ** * ** * ** EDIT ** * ** * ** * ** * ****

Après les réponses, je crée les fichiers, à faire ajouter ceci incluent:

#include <fcntl.h> 

Et j'ajouter ces deux lignes avant la phrase ftok:

llave1=open("/tmp/a",O_RDWR|O_CREAT,0644); 
llavesem=open("/tmp/b",O_RDWR|O_CREAT,0644); 

Les fichiers sont créés mais j'ai toujours la même erreur.

[email protected]/: ls -l /tmp/a 
-rw-r--r-- 1 ubuntu ubuntu 0 Sep 11 00:11 /tmp/a 
[email protected]/: ls -l /tmp/b 
-rw-r--r-- 1 ubuntu ubuntu 0 Sep 11 00:11 /tmp/b 

Des idées?

Merci!

Répondre

0

Avez-vous créé un sémaphore dans un processus séparé? Si ce n'est pas le cas, vous devez ajouter l'indicateur IPC_CREAT pour que le système crée un sémaphore pour vous. Si vous ne spécifiez pas cette option et que vous ne l'avez pas créée dans un autre processus, il n'y a pas de sémaphore auquel vous pouvez accéder.

Assurez-vous de vérifier également http://linux.die.net/man/2/semget pour plus d'informations.

+0

Super !!! J'ai changé cette ligne: idsem = semget (llavesem, 1, IPC_CREAT); au lieu de "0" j'ai mis "IPC_CREAT" et ça marche !! Maintenant, je suis confronté à un "core dump" échoue: -D – user1660559

+1

J'ai copié et collé votre code avec l'indicateur IPC_CREAT supplémentaire dans un fichier de test et il semble fonctionner sans erreurs. Pouvez-vous vérifier que le code de votre question d'origine est toujours exact et génère des erreurs? Aussi qu'est-ce que valini? Il n'est pas défini dans le code que vous avez posté donc j'ai fait un int simple. –

0

vous devez tester si ftok appel a été un succès ou non avant de l'utiliser dans semget (le premier argument de ftok doit se référer à un fichier existant, accessible).

+0

ok, je crée les fichiers avec ce code: #include llave1 = ouvrir ("/ tmp/a", O_RDWR | O_CREAT, 0644); llavesem = ouvert ("/ tmp/b", O_RDWR | O_CREAT, 0644); Les fichiers sont créés: ubuntu @ /: ls -l/tmp/a -rw-r - r-- 1 ubuntu ubuntu 0 le 11 septembre 00h11/tmp/a ubuntu @ /: ls -l/tmp/b -rw-r - r-- 1 ubuntu ubuntu 0 Sep 11 00:11/tmp/b Mais je reçois toujours la même erreur. Des idées? Merci!! – user1660559

Questions connexes