2012-04-18 4 views
1

구조체 유형을 공유하는 코드를 작성하려고하지만 공유 메모리의 구조체 멤버에 tryign을 쓰면 세그먼트 화 오류가 발생합니다. 공유 메모리는 다음과 같습니다. 부모 프로세스와 자식 프로세스 사이. 코드에서 보여주는 메신저로, 지금은 구조체 멤버에 액세스 할 수 있습니다. 그래서 나중에 동기화를 위해 세마포를 사용할 수 있습니다."C"의 공유 메모리에서 구조체 멤버에 액세스

고지.

typedef struct file 
{ 
    char *shmPtr; 
} file_entry; 

int main (void) 
{ 

    int shmid; 
    int n; 
    file_entry *entries; 

    if (fork() == 0) { 
     /*wait for a while*/ 

     if ((shmid = shmget(20441, sizeof(file_entry), 0666)) == -1) { 
      printf("shmget"); 
      exit(2); 
     } 

     entries = (file_entry*) shmat(shmid, 0, 0); 
     if (entries->shmPtr == (char *) -1) { 
      printf("problem2"); 
      exit(2); 
     } 

     printf("\nChild Reading ....\n\n"); 
     printf("%s\n", entries->shmPtr[0]); 
     printf("%s\n", entries->shmPtr[1]); 
     putchar('\n'); 
     printf("\nDone\n\n"); 
    } else { 
     if ((shmid = shmget(20441, sizeof(file_entry), IPC_CREAT | 0666)) == -1) { 
      printf("problem3"); 
      exit(2); 
     } 

     entries = (file_entry *) shmat(shmid, 0, 0); 
     if (entries->shmPtr == (char *) -1) { 
      printf("problem4"); 
      exit(2); 
     } 
     printf("done attachment"); /*the parent prints this statment, then segmentation fault*/ 

     entries->shmPtr[0]='a'; 
     entries->shmPtr[1]='b'; 
     putchar('\n'); 

     wait(); 
     shmdt(&shmid); 
    } 
    exit(0); 
} 

답변

1

shmat은 공유 메모리 영역에 대한 포인터를 반환합니다. 코드에서 shmat을 호출 한 후 entries은 공유 영역을 가리 킵니다. 그런 다음 공유 영역의 처음 몇 바이트를 char (shmPtr)에 대한 포인터로 처리합니다. shmPtr 값은 초기화되지 않으며 임의의 위치를 ​​가리 킵니다. 그런 다음 그것에 쓰고 세그먼트를 얻으려고합니다.

편집 :

리처드가 제안한 것처럼, 당신은 구조체 없애 단지 char *를 사용할 수 있습니다. 그러나 나는 struct을 사용하는 이유를 추측하고 있으며 char *이 아니라 앞으로 구조에 추가 필드를 추가 할 계획입니다. 그런 경우가 있다면, 당신은 유연한 배열 구성원 사용할 수 있습니다

typedef struct file 
{ 
    int flag; 
    int blah; 
    char shmPtr[]; 
} file_entry; 

및 버퍼 크기가 고정되어있는 경우 할당은 물론

shmget(20441, sizeof(file_entry) + bufsize, IPC_CREAT | 0666) 

되고, 당신은 그냥 하드 코드 수 :

typedef struct file 
{ 
    int flag; 
    int blah; 
    char shmPtr[BUFSIZE]; 
} file_entry; 

/* ... */ 
shmget(20441, sizeof(file_entry), IPC_CREAT | 0666) 
+0

필자는 file_entry가 char *에 typedef되어야한다고 말하고 싶습니다. –

+0

@ g.inozemtsev 대단히 고마워, 그게 내 문제를 해결했다. – CodeRed

관련 문제