저는 명명된 파이프를 통해 데이터를 게시하는 프로세스를 만들고 있으며 여러 구독자가 있을 것으로 예상하고 있습니다. 새로운 구독자가 파이프를 열려고 할 때마다 프로세스가 명명된 파이프를 닫도록 할 수 있는 방법이 있습니까?
명확성을 위해 편집됨 방송모델을 사용하려고 합니다.
- 저는 구독자가 1명인지 N명인지 구분하지 않습니다.
- 구독자가 없어도 걱정이에요. 아무도 듣고 있지 않으면 시스템의 일부를 종료하겠습니다.
- 데이터 처리에는 관심이 없습니다. 누군가가 구독하면 전체 데이터 세트를 얻을 수 있기를 바랍니다.
- 구독자는 이전 데이터를 받아서는 안 됩니다. 파이프를 열면 새 데이터가 스트림으로 표시됩니다.
답변1
먼저 제목의 질문은 다음과 같습니다.
여러 프로세스가 명명된 파이프를 열 수 있습니까?
대답은 '예'입니다. 내 말은, 동시에 한 명 이상의 독자와 한 명 이상의 저자가 있다는 것입니다.
이제 실제 질문은 다음과 같습니다.
새로운 구독자가 파이프를 열려고 할 때마다 내 프로세스가 명명된 파이프를 닫도록 하는 방법이 있습니까?
"킥오프"가 무엇을 의미하는지 잘 모르겠지만 일반적인 대답은 다음과 같습니다.
- 쓰기 위해 파이프를 여는 것은 다른 사람이 읽기 위해 열 때까지 차단 작업이고, 리더 없이 파이프에 쓰면 SIGPIPE가 트리거되기 때문에 작성자(게시자)는 적어도 한 명의 리더(구독자)가 있음을 확신할 수 있습니다.
반면에 작성자는 주어진 시간에 여러 명의 독자가 있는지 알 수 있는 방법이 없습니다. 다음을 사용하여 FIFO 활동을 모니터링하면 이 문제를 완화할 수 있습니다.inotify
, 하지만) - 게시자가 보낸 메시지는 특정 독자를 대상으로 할 수 없습니다.
- 게시자가 작성한 메시지의 내용은 독자 간에 중복되지 않습니다. 즉, 각 독자는 작성자로부터 동일한 메시지를 받습니다. 대신 모든 독자가 그 일부를 읽을 것입니다. 예를 들어, 세 명의 구독자(리더)가 있는 파이프에 "HELLO WORLD"를 쓰면 첫 번째 구독자는 "HELL"을 수신하고 두 번째 구독자는 "LORD"를 수신하며 마지막 구독자는 "OW"를 수신합니다.
[편집] 이제 귀하의 질문을 명확히 했고 위에 쓴 내용이 여전히 적용되므로 명명된 파이프가 귀하의 요구에 맞는 도구가 아니라는 결론을 내릴 수 있습니다. 브로드캐스트/멀티캐스트 UDP 소켓이나 전용 메시징 시스템이 필요할 수 있습니다.D 버스,AMQP브로커 등