2015-02-04 2 views
1

저는 a flow-based programming system called net2sh으로 일하고 있습니다. 현재는 명명 된 파이프로 연결된 셸 도구를 기반으로합니다. 여러 프로세스가 함께 작업하여 공장에서 생산 라인과 달리 명명 된 파이프를 통해 통신합니다.병렬 명명 된 파이프로 교착 상태를 피하는 방법?

일반적으로 잘 작동하고 있지만 중요한 문제가 하나 있습니다. 프로세스가 둘 이상의 명명 된 파이프를 통해 통신하는 경우 "송신"프로세스와 "수신"프로세스는 파이프를 동일한 순서로 열어야합니다. 이는 프로세스가 명명 된 파이프를 열 때 다른 쪽 끝이 열릴 때까지 차단되기 때문입니다.

기존의 구성 요소를 해킹하지 않고이 문제를 피하기 위해 프로그램 네트워크를 망칠 필요없이 각 파이프에 대한 추가 "도우미"프로세스를 생성하지 않고이를 피하는 방법을 원합니다.

이상적으로 나는 "비 블로킹 FIFO"옵션을 찾고 있는데, FIFO의 "open"은 항상 즉시 성공하지만 파이프 버퍼가 가득 찬 (또는 비어있는 경우) 후속 작업이 차단 될 수 있습니다. 그 효과를 내기 위해 커널 패치를 사용하는 것을 고려해보십시오. fifo (7)에 따르면 O_NONBLOCK은 FIFO를 열 때 뭔가 다른 일을합니다. 정확히 원하는 것은 아니며, cat을 사용하여 모든 기존 쉘 도구를 다시 작성해야합니다. 당신이이 문제를 해결하는 데 도움이 할 수있는 경우

mkfifo a b 
(> a; > b;) & 
(< b; < a;) & 
wait 

하는 것이 현명 나는 매우 감사하게 될 것입니다 :

여기 교착 최소한의 예입니다!

답변

2

여기 명명 된 파이프와 O_NONBLOCK를 사용하는 좋은 설명이있다 : 당신이 어떤 C 코드를 변경하지 않고 전체 환경에서 작업 할 같은 How do I perform a non-blocking fopen on a named pipe (mkfifo)?

그것은 소리가. 따라서 open(2)에 대한 래퍼가 포함 된 공유 라이브러리에 LD_PRELOAD을 설정하면 pathname이 명명 된 파이프를 참조 할 때마다 O_NONBLOCKflags에 추가합니다.

라이브러리 함수를 재정의 LD_PRELOAD를 사용하여 간결한 예는 여기에 있습니다 :이 실제로 무엇을 파괴하지 않고 실제로 작동 여부 https://www.technovelty.org/c/using-ld_preload-to-override-a-function.html

, 당신은 자신을 찾을해야합니다 (저희에게 알려 주시기 바랍니다!) .

+0

감사합니다. 좋은 생각입니다. 나는 O_NONBLOCK을 추가하는 것뿐만 아니라 열 수있는 해커리를 추가해야한다고 생각한다.하지만 가능할 수도있다. 매우 감사. LD_PRELOAD는 다소 악하지만 커널을 패치하는 것보다 안전하고 어렵지 않습니다! –

관련 문제