2012-08-27 5 views
6

Linux에서 내 프로젝트의 프로세스간에 데이터를 공유하기 위해 shmget을 사용하고 있습니다.shmget에서 키로 사용할 안전한 값

int shmget(key_t key, size_t size, int shmflg); 

그러나, 다른 프로그램도 SHMGET을 호출 할 수 있습니다, 따라서 그것은 (키 충돌이 발생할 수 있습니다 내가하는 shmget를 호출 키로 상수를 사용하기 때문에, 내가 대신 생성 된 키 때문에의 상수를 사용해야합니다 횡 방향 프로세스가 구축되고 별도로 실행됩니다).

shmget에서 키로 사용할 안전한 값은 무엇입니까?

답변

5

난 당신이 대신에, 그것은 너무 오래 당신이 다른 소프트웨어와 같은 이름 영역을 사용하지 않는 한 ftok 존재 충돌의 문제가 발생하지 않습니다 (mmap 사용) POSIX shm_open를 사용하는 것이 좋습니다.

6

안전한 값이 없으며 사용자 (및 공유 세그먼트를 만드는 다른 모든 프로세스)는 IPC_EXCL을 사용하여 충돌이 발생하지 않도록해야합니다. 그러나 후자는 다른 프로그램이 세그먼트에 쓰기 시작하지 않도록해야합니다 (잘못 작성하지 않은 경우).

ftok()에서 '비공개'키 상수를 구축 할 수 있지만 안전하지는 않습니다. 충돌하는 경우 프로그램에 이것이 올바른 키가 아니라고 말할 수있는 방법이 없습니다. 또한 다음을 기억하십시오 :

id의 하위 8 비트 만 중요합니다. ftok()의 ​​동작은이 비트가 0 일 경우 지정되지 않습니다.

즉, 0을 전달하지 마십시오.

어쨌든 은 약간의 의사 소통 채널을 만드는 것을 고려해야합니다. 서버가 id로 작성한 하나의 파일로 충분할 것입니다. 그러면 다른 프로그램에서 읽을 수 있습니다.

다른 아이디어로는 서버 PID를 id으로 전달할 수 있습니다. 이렇게하면 조금 더 안전해질 수 있습니다.

+0

나는 무작위 키를 생성하는 것을 고려하고 있으며 수용 가능한 키가 발견 될 때까지 IPC_EXCL 플래그를 사용하여 shm 세그먼트를 반복한다. 그러나 이것이 좋은 옵션인지 모른다. – jondinham

+1

@PaulDinh : 네, 그게 좋은 옵션입니다. 음,하지만 특정 'sizeof (key_t)'에 의존하지 않고 무작위 키를 생성 할 수있는 방법이 필요합니다. ftok()에 임의의 id를 사용하고 싶습니다. –

+0

각 클라이언트가 서버와의 효율적인 IPC를위한 공유 메모리 세그먼트를 관리하는 클라이언트 - 서버 시나리오가있는 경우 고유 한'shmget() '키를위한 좋은 옵션 중 하나는'gettid()'시스템 호출 호출자의 스레드 ID를 반환합니다. 하지만 이것은 리눅스에 따라 다르다. –

관련 문제