2009-04-16 5 views
-3

Beim Ausführen dieses Codes erhalte ich einen Segmentierungsfehler. Ich kann nicht herausfinden, warum das passiert - kann irgendjemand einen möglichen Grund sehen? (Ich habe schon bekam und initialisiert die gemeinsam genutzten Speicher der Semaphore.)Warum erhalte ich einen Segmentierungsfehler mit diesem Code?

Mein 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

Versuchen Sie, mit dem Debugger ausgeführt wird, um herauszufinden, * wo * Ihr Code fehlschlägt . Bearbeiten Sie das dann zu einer vernünftigen Länge und einer fokussierteren Frage. – dmckee

+3

Haben Sie eine Core-Dump-Datei erhalten? Versuche es mit gdb zu öffnen. – Alan

+0

@Mark Ingram: Tut mir leid, ich habe deinen Schnitt gecrobed. Ich habe versucht, die beiden in das Beste beider Welten zu kombinieren (und ihre Veränderung von "während" zu "während" geändert!: P). –

Antwort

13

Nach einem kurzen Blick (sehr schnell), ich würde sagen, dass es durch

verursacht werden kann
struct sembuf buf[1]; 

/*some other code*/ 

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

Sie greifen auf Speicher außerhalb des Puffers zu. buf [1] Speicher in dem Stapel für nur eine Struktur sembuf behält, Sie versuchen, 2. In diesem Fall zu verwenden, sollten Sie

struct sembuf buf[2] 
+0

+1 Vielleicht werden Sie die Buf [0] aus Ihrem Codeblock entfernen, um zu zeigen, dass der "schlechte" Code der zugreifende Fehler ist [1]. – lothar

+0

Sicher, macht es klarer. Vielen Dank. – Tom

+1

wirklich wirklich danke bro. Das war der Grund. Wirklich danke, dass du darauf hingewiesen hast. danke an alle für die antwort. – mawia

2

Array Zuordnung zu klein verwenden.

Dieses Beispiel ist im Allgemeinen zu lang, um als ein gutes Beispiel betrachtet zu werden; Versuchen Sie, einen kleineren (minimalen ist ideal) Fall zu finden, der den Fehler repliziert, insbesondere einen, der von so wenig externen Bibliotheken wie möglich abhängt. Versuchen Sie außerdem, den Debugger auszuführen und den Code vor der Abfrage durchzugehen.

4

Ah ... es ist offensichtlich etwas sehr falsch, wenn Sie

struct sembuf buf[1]; 

erklären, aber ein paar Zeilen später tun

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

danke für die Antwort Bruder. danke für das darauf hinweisen. – mawia