2009-04-16 4 views
-3

Je reçois une erreur de segmentation lors de l'exécution de ce code. Je ne peux pas comprendre pourquoi cela se produit - quelqu'un peut-il voir une raison possible? (Je l'ai déjà obtenu et initialisé la mémoire partagée du sémaphores.)Pourquoi ai-je une erreur de segmentation avec ce code?

Mon code:
#include<stdlib.h> 
    #include<sys/types.h> 
    #include<sys/shm.h> 
    #include<sys/ipc.h> 
    #include<stdio.h> 
    #include<sys/sem.h> 

    union semun 
    { 
    int val; 
    struct semid_ds *buf; 
    unsigned short *array; 
    } arg; 



    int main() 
    { 
    key_t semkey; 
    int shmid,semid,nsem,sops; 
    struct sembuf buf[1]; 

    char *ptrr,*shm,c,*s; 

    semkey=ftok("/home/mawia/abc.c",'a'); 

    printf("entered into main of producer\n"); 
    if(semkey<0) 
    { 
    perror("ftok"); 
    exit(1); 
    } 

    shmid=shmget(semkey,30,0777); 

    if(shmid<0) 
    { 
    printf("error"); 
    perror("shmget"); 
    exit(1); 
    } 

    shm=shmat(shmid,0,0); 
    if(shm==(char *) -1) 
    { 
    perror("shm"); 
    exit(1); 
    } 

    s=shm; 
    semid=semget(semkey,1,0777); 
if(semid<0) 
{ 
    printf("error"); 
    perror("semget"); 
    exit(0); 
} 

ptrr=shm+1; 
*s='w'; 
printf("going to check the value 0th semaphores\n"); 
buf[0].sem_num=0; 
buf[0].sem_op=0; 
    buf[0].sem_flg=0; 
buf[1].sem_num=0; 
buf[1].sem_op=1; 
buf[1].sem_flg=0; 
    printf("entered the critical region\n"); 
//printf("waiting to enter the buffer zone..."); 
semop(semid,buf,2); 

printf("entered the critical region\v"); 
if(*s!='r') 
{ 
    printf("\nPRODUCER IS PRODUCING\n\n\n"); 

    printf("ENTER DATA\n"); 

    while((c=getchar())!='\n') 
    { 
    *ptrr++=c; 
    } 
    *ptrr='\0'; 
    *s='r'; 
} 

    else 
    printf("RESOURCE IS FULL:CAN'T PRODUCE"); 

//printf("produced enough for the consumer \nexiting from the buffer area now..."); 
buf[0].sem_num=0; 
buf[0].sem_op=-1; 
buf[0].sem_flg=0; 

semop(semid,buf,1); 

ptrr=shm+1; 

    if(!strcmp(ptrr,"exit")) 
    { 
    printf("exiting..."); 
    exit(0); 
    } 
    sleep(1); 

return 0; 
    } 
+3

Essayez de lancer le débogueur pour savoir où * * votre code échoue . Puis modifiez-le à une longueur raisonnable et une question plus ciblée. – dmckee

+3

Avez-vous obtenu un fichier de vidage de base? Essayez d'ouvrir ça avec gdb. – Alan

+0

@Mark Ingram: Désolé, j'ai bousillé votre montage. J'ai essayé de combiner les deux dans le meilleur des deux mondes (et inversé votre changement de "while" à "while"!: P). –

Répondre

13

Après un rapide coup d'œil (très rapide), je dirais que cela peut être causé par

struct sembuf buf[1]; 

/*some other code*/ 

buf[1].sem_num=0; 
buf[1].sem_op=1; 
buf[1].sem_flg=0; 

Vous accédez à la mémoire en dehors du tampon. buf [1] se réserve la mémoire dans la pile pour une seule sembuf struct, vous essayez d'utiliser 2. Dans ce cas, vous devez utiliser

struct sembuf buf[2] 
+0

+1 Peut-être que vous supprimerez les buf [0] de votre bloc de code pour montrer que le "mauvais" code est celui qui accède au bug [1]. – lothar

+0

Bien sûr, le rend plus clair. Merci. – Tom

+1

vraiment vraiment merci mon frère. C'était la raison. Merci vraiment d'avoir signalé cela. merci à tous pour répondre. – mawia

2

allocation Array trop petit.

Cet exemple est généralement trop long pour être considéré comme un bon exemple; essayez de trouver un cas plus petit (idéal est minimal) qui réplique l'erreur, en particulier celle qui dépend du moins de bibliothèques externes possible. En outre, essayez d'exécuter dans le débogueur et parcourir le code avant de demander.

4

Ah ... il y a évidemment quelque chose de très mal quand vous déclarez

struct sembuf buf[1]; 

mais quelques lignes font plus tard

buf[1].sem_num=0; 
buf[1].sem_op=1; 
buf[1].sem_flg=0; 
+0

merci pour la réponse frère. merci de souligner cela. – mawia

Questions connexes