2014-10-25 2 views
1

서로 다른 프로세스간에 정보를 공유하는 프로그램을 구현해야합니다.공유 메모리 세그먼트에 액세스 할 때 분할 오류가 발생했습니다.

하지만 공유 구조의 멤버에 액세스하려고하면 세그먼트 오류가 발생합니다.

어떻게 해결할 수 있습니까? 아래 내 코드를 참조하십시오.

소스 파일 :

#include <string.h> 
#include <stdio.h> 
#include "ShM.h" 

#define SHM_SIZE 1024 

int main(){ 

    stablishMemory(); 
    Deck *deck = obtainMemory(); 
    strncpy(deck->cards,"carlos",SHM_SIZE); 
    unlinkMemory(); 
    return 0; 
} 

헤더 파일 (ShM.h) :이 구조 자체에 포함되지

#include <stdio.h> 
#include <string.h> 
#include <sys/shm.h> 
#include <unistd.h> 

int idMemory; 

typedef struct { 
    char *cards; 
}Deck; 

Deck* letra; 
#define SHM_SIZE 1024 

void stablishMemory(){ 
    idMemory = shmget (obtainkey(), SHM_SIZE, 0777| IPC_CREAT); 
    letra = (Deck*)shmat (idMemory, NULL,0); 
} 

key_t obtainkey(){ 
    return ftok("/bin/ls",24); 
} 

void unlinkMemory(){ 
    shmdt((Deck*)letra); 

} 

Deck* obtainMemory(){ 
    return letra; 
} 

void destroyMemory(){ 
    shmctl(idMemory, IPC_RMID, (struct shmid_ds*)NULL); 
    unlink(" "); 
} 
+0

을 오류가 있는지 확인하고 있지 않습니다. – o11c

+0

@ o11c 어떤 종류의 오류가 있습니까? 'ftok','shmget'와 같은 – cafej

+0

함수는 모두 오류를 반환 할 수 있습니다. 오류 점검은 선택 사항이 아닙니다. – o11c

답변

2

. 구조는 공유 메모리 내에 있지만 포인터 카드은 아무 곳이나 가리킬 수 있습니다.

typedef struct { 
    char *cards; // the memory that cards points to could be outside the segment 
} Deck; 

당신은 카드 (그 매달려 포인터를) ALLOC해야하지만, 더 중요한 것은, 당신은 또한 공유 된 지역에서 카드를를 ALLOC해야하며, 그렇지처럼 (구조 내에서) 인라인 버퍼합니다

deck = allocSharedMem(sizeof(*deck)); 
deck->cards = allocSharedMem(52); 

을하거나 인라인을합니다 :

하나는 할

typedef struct { 
    char cards[52]; 
} Deck; 
+0

이것은 훌륭하게 작동했습니다. 대괄호를 추가하고 약간의 코드를 수정했습니다. 감사합니다 @codenheim – cafej

관련 문제