2016-05-11 10 views
0

alles, was ich tun möchte, ist einfach "Hey" in meinen gemeinsamen Speicher schreiben, aber es wird auf diese Zeile geworfen. sehr einfachen Code wie folgt:schreibe in shared memory Segmentierungsfehler

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <sys/fcntl.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/sem.h> 
#include <sys/shm.h> 
#define SHM_SIZE 1024 
#define FLAGS IPC_CREAT | 0644 
int main(){ 
    key_t key; 
    int shmid; 
    if ((key = ftok("ex31.c", 'k')) == -1){ 
     exit(1);}   
    if ((shmid = shmget(key, SHM_SIZE, FLAGS)) == -1) { 
      exit(1);} 
    char* shmaddr; 
    if(shmaddr=shmat(shmid,0,0) == (char*)-1){ //WRONG ARGUMENTS ?? 
      exit(0); } 
    printf("opened shared memory\n"); //gets here 
    strcpy(shmaddr, "hey");  //GETS THROWN HERE 
    printf("after writing to memory\n"); //never get here 

der Fehler der Debugger mir gibt, ist:

Programmsignal SIGSEGV empfangen, Fehlersegmentierung. 0x0000000000401966 in Haupt (argc = 1, argv = 0x7fffffffe068) um ​​ ../ex31.c:449 449 strcpy (shmaddr, "hey"); // GETS THROWN HIER

+2

Geben Sie die Ausgabe von 'ipcs -m' ein. –

+0

entschuldigen Sie mich? Es gibt keine Ausgabe, das ist alles, was ich habe –

+0

Haben Sie irgendwelche Kompilierungswarnungen bekommen? Hast du sie gelesen? Sie sollten genau erklären, was falsch ist. –

Antwort

0

Das Problem ist Operator Vorrang. In der Zeile

shmaddr=shmat(shmid,0,0) == (char*)-1) 

Dann ist die einstelligen - Betreiber und der Cast-Operator haben die höchste Priorität, gefolgt von ==, gefolgt von =, die die niedrigste Priorität hat. Ihr Code stellt sich also als gleich

dar.
shmaddr=(shmat(shmid,0,0) == (char*)-1)) 

was Unsinn ist.

Zuordnung innerhalb Bedingungen ist sehr schlecht Programmierpraxis. Jeder halbwegs ordentliche Compiler wird Sie warnen, wenn Sie es versuchen. Abgesehen von den Operator-Vorrang-Problemen ist es leicht, = und == zu verwechseln. Außerdem führt der Operator = einen Nebeneffekt für den Ausdruck ein, sodass das Mischen mit anderen Operatoren zu undefiniertem Verhalten führen kann. Und am wichtigsten ist vielleicht, dass Putting = Inside Conditions die Lesbarkeit von Codes in der Regel stark reduziert.

Der Code sollte wie folgt geschrieben werden:

shmaddr = shmat(shmid,0,0); 
if(chmaddr == (char*)-1){ 

Es ist wichtig zu verstehen, dass Sie nichts gewinnen durch diese zwei Zeilen in 1. Die erzeugte Maschinencode Verschmelzung wird identisch sein, abgesehen von der fehlenden Fehler in der obigen Version.