2012-04-01 2 views
5

나는 구조체가 :C에서 공유 메모리 (shmget/shmat)를 수정하는 방법?

그런 다음
size_t shmsize = sizeof(struct sdata); 
shmid = shmget(IPC_PRIVATE, shmsize, IPC_CREAT | 0666); 

나는이 같은 공유 메모리에 액세스 :

struct sdata *data = shmat(shared.shmid, (void *) 0, 0); 
data->time = time(NULL); // function returns the current time 

내 질문은

struct sdata { 
    int x; 
    int y; 
    time_t time; 
}; 

을 다음과 같이 내가 구조체에 대한 공유 메모리를 생성 아주 간단합니다. 이것이 공유 메모리를 액세스/수정하는 올바른 방법입니까? 이것이 최선의 접근 방법입니까?

(나는 동기화를위한 시스템 V 세마포어를 사용하고 내가 그 코드를 포함하지 않았다. 난 그냥 제대로 공유 메모리를 수정/접근하고 있는지 확인하고 싶었다.)

답변

2

이것은 정확합니다.주의 할 점은 개인 공유 메모리 세그먼트를 작성한다는 것입니다. 즉, 공유 프로세스를 사용하려는 다른 프로세스로 shmid를 전송해야 함을 의미합니다.

+1

다른 프로세스가'fork()'되어 있다면 공유 메모리가'fork()'전에 만들어져있는 한 IPC_PRIVATE에 문제가 없습니다. 더 일반적인 경우에는주의해야합니다. –

4

예, 그것은하는 방법입니다 공유 메모리를 생성 한 다음 액세스하거나 수정하십시오. 그러나 sychronizaton 문제가있을 수 있습니다. Posix 세마포어. 먼저 sem_overview(7) 매뉴얼 페이지를 참조하십시오.

+0

감사합니다. 나는 동기화와 잘 어울린다. 나는 단지 "data-> time = time (null); 또는 data-> x = 5"를 수행하는 것에 대해 걱정했다. – bfresh

관련 문제