2014-09-02 2 views
3

내 응용 프로그램에서는 부모와 자식 간의 IPC (Linux 및 Windows)에서 공유 메모리를 사용하고 있습니다. 코드를 다음비동기 공유 메모리 읽기/쓰기

char buf[BUF_SIZE/4]; 
//pBuf is the shared memory location 

sem_wait(semn); 
//Wait for the parent process to write on the shared memory. 
memcpy(buf, pBuf, sizeof(buf)); 
//Signal the parent 
sem_post(sem0); 

이 작성 :이 경우

//Data is in buf, pBuf is shared memory. 
memcpy(buf, pBuf, sizeof(buf)); 
sem_post(semn); 
sem_wait(sem0); 

, 하나 개의 프로세스 경우 리눅스에 대한 전체 코드는 내가 공유 메모리에서 읽어 리눅스에 코드를 다음 한 https://github.com/devendermishra/SharedMemoryTest/blob/master/shmem_linux.cpp

에있다 오랜 시간 동안 쓰지 않으면 다른 프로세스가 무기한 대기하게됩니다. 한 가지 해결책은 작업을 완료 할 수없는 경우 즉시 sem_trywait을 사용하여 복귀하는 것입니다. 그러나이 경우 잠길 수 있는지 확인하려면 다시 sem_trywait에 전화해야합니다. 파일과 마찬가지로 select 또는 poll과 유사한 메커니즘이 여러 개의 세마포어 상태를 확인하고 신호가있는 경우 단일 세마포어에서 차단되는 것이 아니라 작동을 수행합니까?

답변

3

Posix 세마포어의 경우 poll과 유사한 메커니즘이 없습니다.

파이프를 사용합니다. 일반 파일 기술자가 관리하므로 poll 등으로 대기 할 수 있습니다.

가장 간단한 방법은 공유 메모리가 아닌 모든 데이터를 전달하는 것입니다. 커널 메모리 안팎으로 데이터를 복사하는 데 드는 비용이 문제가된다면 공유 메모리를 유지하고 단일 문자를 파이프를 통해 신호로 보내 효과적으로 신호를 세마포로 사용합니다.

+0

빠른 답변 감사드립니다. 나는 유닉스 소켓과 임시 파일조차도 신호로 사용할 수 있다고 생각한다. 이것들 중에서 어느 것이 좋은 성능을 가지고 있습니까? 파이프를 다른 신호보다 신호로 선택하는 이유가 있습니까? – doptimusprime

+0

@dbasic : 유닉스 소켓은 아마도 파이프와 비슷한 동작과 성능을 가지지 만, 나는 그것들에 대해 많이 모른다. 나는 파일을 사용하지 않을 것이다. 그 행동은 단순히 데이터를 전송하기 위해 원하는 것이 아니며 성능을 디스크에 기록하여 성능에 영향을 줄 수 있으며 프로그램을 시작하고 중지 할 때 지속성으로 인해 복잡성이 발생할 수 있습니다. –

+0

이 질문은 파이프에 관한 것이 아니라 세마포어에 관한 것이 었습니다. 이것은 IPC의 두 가지 다른 방식입니다. 당신은이 질문에 대답하지 않습니다. – Maciej