문제

누군가가 널이 아닌 두 번째 매개 변수와 함께 함수 shmat ()를 사용하여 (합리적으로) 예를 제공 할 수 있습니까?

매뉴얼의 말 :

#include <sys/shm.h>

void *shmat(int shmid, const void *shmaddr, int shmflg);

SHMAT () 함수는 공유 메모리 식별자 SHMID와 관련된 공유 메모리 세그먼트를 호출 프로세스의 데이터 세그먼트에 첨부합니다. 세그먼트는 다음 기준 중 하나에 의해 지정된 주소에 첨부됩니다.

  • 만약에 shmaddr 널 포인터이며 세그먼트는 시스템에서 선택한 첫 번째 사용 가능한 주소에 첨부됩니다.
  • 만약에 shmaddr 널 포인터가 아니며 (SHMFLG & SHM_RND)는 0이 아니며 세그먼트는 (SHMADDR- (SHMADDR % SHMLBA)에 의해 주소에 첨부됩니다.
  • 만약에 shmaddr 널 포인터가 아니며 (SHMFLG & SHM_RND)는 0입니다. 세그먼트는 SHMADDR에 의해 주소에 첨부됩니다.

그러나 나는 Shmaddr이 Null로 설정된 SHMAT의 예를 본 적이 없다. 내 프로젝트에서 프로세스가 malloc()'에드 메모리 조각은 괜찮고 잘 사용할 수 있습니다. 그런 다음 다른 프로세스는 공유 메모리 (SHMID)에 대한 포인터를 획득 한 다음 메모리에 액세스하려고하면서 SEGFAULTED를 얻었습니다.

도움이 되었습니까?

해결책

여기서 아이디어는 다른 프로세스의 동일한 가상 주소에 세그먼트를 공유하여 공유 메모리의 항목을 해결하기 위해 일반 포인터 (오프셋이 아님)를 사용할 수 있도록하는 것입니다. 일반적인 시나리오는 단일 "마스터"프로세스에 대한 것입니다. 커널 제공 주소 (두 번째 인수 제로)에서 메모리를 매핑 한 다음 해당 주소를 일부를 통해 "작업자"프로세스에 전달합니다. 대역 밖 채널 (Fork/Exec, UNIX 소켓, FIFO 등의 명령 인수와 같은 경우, "작업자"는 해당 주소에서 세그먼트를 매핑하려고합니다. 다시 말하지만, 커널이 "마스터"에 대해 주어진 VA에서 공유 메모리를 매핑 할 수 있다면 "작업자"프로세스에 대해 동일한 주소가 적합해야한다는 것입니다.

나는 "합리적인"예제가 없다. 방법을 살펴볼 수 있습니다 포스트 그레 공유 메모리와 함께 작동합니다. 그래도 약간 관련되어 있습니다.

다른 팁

절대 포인터와 구조를 공유 할 수 있다고 생각합니다.

그러나 코드 샘플이 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top