기존 명명된 파이프 덮어쓰기 방지

기존 명명된 파이프 덮어쓰기 방지

나는 다음 명령을 가지고 있습니다 :

ql_receiver_lock_holder > "${my_named_pipe}"

명명된 파이프가 이미 존재하는 경우 이를 덮어쓰나요? 재정의를 피하는 가장 좋은 방법은 간단히 사용하는 것입니다.

ql_receiver_lock_holder >> "${my_named_pipe}"

답변1

명명된 파이프로 리디렉션하면 파이프가 삭제되지 않고 파이프를 통해 데이터가 전달되거나 파이프에서 읽은 내용이 없으면 차단됩니다.

이는 명명된 파이프를 사용하는 일반적인 방법입니다. 이를 생성한 다음 이를 통해 데이터를 보냅니다.

답변2

>open()in mode O_WRONLY|O_TRUNK대신 >>mode 에서 실행 하지만 명명된 파이프의 경우 차이가 없습니다.open()O_WRONLY|O_APPEND

고려해야 할 3가지 상황이 있습니다.

  1. 아직 읽기 위해 fifo 파일을 연 프로세스가 없습니다. 그런 다음 open()(명령이 실행되기 전에 셸에 의해 수행됨) 일부 프로세스가 읽기 위해 파일을 열 때까지 차단됩니다.
  2. 일부 프로세스가 읽기 위해 fifo 파일을 열었지만 아직 쓰기 위해 열지 않았습니다. 그러면 open()성공하고 파이프를 인스턴스화합니다. 그러면 명령이 즉시 시작되어 파이프가 가득 차거나 일부 프로세스가 다른 쪽 끝의 내용을 읽을 때까지 데이터가 누적되는 파이프에 쓸 수 있습니다.
  3. 파이프는 이미 인스턴스화되었습니다(fifo 파일이 읽기 및 쓰기용으로 열렸기 때문입니다). 그러면 fd가 open()동일한 파이프로 반환됩니다(새 파이프를 인스턴스화하는 대신). 이는 우리 명령으로 작성된 쓰기가 파이프에 쓰는 다른 명령 쓰기와 인터리브된다는 것을 의미합니다. 쓰기는 이 값 PIPE_BUF(Linux의 경우 4KiB) 보다 작은 경우 에만 원자성이 보장됩니다. 이는 생성된 일반 파이프라인과 다르지 않습니다.pipe()

다른 개방 모드는 O_RDWR(읽기+쓰기)입니다. 셸에서는 <>연산자( 1<>stdout 리디렉션, 그렇지 않으면 fd 0(stdin)에서 열림)를 사용하여 이를 달성할 수 있습니다. 많은 시스템에서 조건을 따르면 절대 차단되지 않습니다. 파이프를 인스턴스화합니다. 아직 인스턴스화되지 않았습니다.

관련 정보