2013-01-18 3 views
0

공유 메모리를 사용하여 파이프를 구현하고 있습니다. main()이 아닌 라이브러리 만 쓰고 만져야합니다.공유 메모리를 사용하여 파이프 구현

이 내 라이브러리 shared_memory_pipe.h 사용하는 일부 사용자의 main() 말할 수 있습니다 :

나는 문제가 발생하여 우리는 아이가 자신의 FD의 모두 닫 볼이 예에서는

#include "shared_memory_pipe.h" 

int main() { 
    int fd[2]; 
    shared_memory_pipe(fd); 
    if (fork()) { 
     while(1) {} 
    } 
    shared_memory_close(fd[0]); 
    shared_memory_close(fd[1]); 
} 

을하지만, 아버지는 무한 루프에 갇혀 있으며 자신의 CD를 닫지 않습니다. 이 경우 내 파이프가 여전히 존재해야합니다 (모든 쓰기 fd가 닫히거나 모든 읽기 fd가 닫히거나 모두 닫히기 때문에 파이프가 사라집니다).

내가 전에, 난 단지 도서관 (shared_memory_pipe.h를) 쓰기 말했듯이. 도서관 내에서 fork()이 만들어 졌는지 어떻게 알 수 있습니까?

어떻게 내 공유 메모리 파이프 끝을 쓰기/독서있는 다른 방법이 있다는 것을 알 수 있습니다, 그래서 내 공유 메모리 파이프를 닫지/종료 알?

fork() 또는 그와 비슷한 것이 있다는 것을 알고있는 명령에 대해 들었지만 찾지 못했지만 모릅니다.

미리 감사드립니다. 자세한 정보가 필요한지 물어보십시오.

답변

0

는 포크하기 전에 부모는 글로벌 pid_t pid_parentgetpid()의 결과를 저장할 수 있습니다. pid_parent에 대한 프로세스 CANN 테스트가 다시 getpid()를 사용하여 시간에 나중에보다

.

getpid()의 결과가 pid_parent과 다른 경우 프로세스가 부모로부터 적어도 하나 이상의 fork() 거리에 있습니다.

+0

내가 이해하지 못했지만, 가 나는'주()가'내가 거기에 할 수 없어 쓰지 않는다. 도서관에서 그 기능을 수행하게된다면 어린이가 라이브러리의 어떤 기능도 사용하지 않을 수도있는 몇 가지 경우가 있습니다. 그래서 그의 pid가 정확히 무엇인지 알 수 없습니다 – hudac

0

어떤 코드 부분이 fd를 닫아야합니까?

는 사용자의 코드 인 경우 다음 fork()은 문제가되지 않습니다. 결국 호출자는 다른 프로그램 (익명 파이프의 일반적인 사용)에 execve을 수행 할 수 있으므로 fd가 아직 열려 있어도 라이브러리 코드가 프로세스에서 사라 졌으므로이를 처리 할 수있는 방법이 없습니다.

FD를 닫는 라이브러리 API가 있다면 그게 전부입니다. exec'ed 프로그램은 어쨌든 당신의 라이브러리를 호출하지 않을 것입니다.

+0

방금 ​​제가 질문을 편집했기 때문에' 'main()'은 실제 파이프와 똑같은 공유 메모리 파이프를 닫아야한다.'pipe (fd)'뒤에'close (fd [0])','close (fd1 [1])' – hudac

+0

@hudac : 좋습니다. 그렇다면 라이브러리가 아니라 fd를 닫는 것이 주된 책임이라면 fd가 제대로 닫히지 않을 때 어떻게해야합니까? 예를 들어 한 파일을 닫을 수는 있지만 다른 파일은 닫을 수 없습니다. – cdarke

+0

맞습니다. 사용자는 원하는 모든 것을 할 수 있습니다 ... 질문 : 어떻게 열린 fd를 추적합니까? 예를 들어 모든 프로세스가 특정 fd에 대한 쓰기면을 닫으면 어떻게 알 수 있습니까?왜냐하면 모든 프로세스가 특정 fd의 쓰기면을 닫았을 때 일반 파이프처럼 파이프를 삭제해야하기 때문입니다. – hudac

관련 문제