exec 3을 사용하여 명명된 파이프를 열어 두십시오.

exec 3을 사용하여 명명된 파이프를 열어 두십시오.

프로세스다음에서 읽기명명된 파이프는 일반적으로 프로세스가 종료될 때 종료됩니다.에 쓰기파이프는 쓰기를 완료합니다(EOF 전송). 어떤 경우에는 간헐적으로 파이프에 데이터를 쓰는 여러 프로세스가 있을 수 있으며 단일 프로세스가 파이프에서 지속적으로 데이터를 읽기를 원할 수 있습니다. 이렇게 하려면 파이프를 열지만 쓰지 않는 "더미" 작성기를 설정할 수 있습니다.

$ mkfifo myPipe
$ cat > myPipe &

가상 기록기는 명명된 파이프를 열린 상태로 유지합니다. 즉, 데이터가 입력되지 않거나 영원히 닫혀 있습니다. 따라서 판독기 프로세스는 종료하고 다시 생성할 필요 없이 모든 (다른) 합법적인 작성자로부터 입력을 받을 수 있습니다.

나는 보았다어떤 사람들은exec 3>대신 cat명명된 파이프를 열어두는 방법으로 사용하세요 .

$ mkfifo myPipe
$ cat < myPipe &
[1] 10796
$ exec 3> myPipe
$ echo "blah" > myPipe
blah

이 접근 방식은 잘 작동하는 것 같고, 백그라운드에 있는 가상 작가에 대해 걱정(또는 정리)할 필요가 없어서 마음에 듭니다. 문제는 내가 그렇지 않다는 거야진짜그것을 얻으십시오.

exec 3>실행할 실제 파일이나 표시되는(백그라운드) 프로세스 없이 명명된 파이프를 열어 두는 작업을 어떻게 수행할 수 있습니까 ? 이 접근 방식에는 단점이 있습니까?

exec 3(결국 쓰기를 위해 명명된 파이프의 입력 파일 설명자를 열어야 한다는 것을 알고 있으므로 이 부분이 수행하는 작업 에 특히 관심이 있습니다 exec 3>.)

답변1

당신은 그것을 잘못 분석했습니다. 그것은 sum exec3>fifo아닙니다 . 명령이 없으면 모든 리디렉션이 기본 셸에 적용되고 리디렉션은 암시적으로 (stdout) 아닌 파일 설명자 인수( 에서와 같이)를 사용할 수 있습니다 .exec 3>fifoexec>3>1

단점은 열린 파일 설명자가 명시적으로 닫히지 않는 한 하위 프로세스/하위 쉘로 전달된다는 것입니다 exec 3>&-(그들 각각에, 파이프의 다른 쪽 끝에 있는 판독기는 모든 하위 프로세스가 종료될 때까지 EOF를 얻지 못하게 됩니다.

파이프를 열린 상태로 유지하고 파이프를 여는 동안 차단하지 않는 또 다른 방법은 파이프를 읽기-쓰기 모드로 여는 것입니다.

mkfifo /tmp/fifo
(exec 1<>/tmp/fifo; echo tee; sed 's/e/o/g; 1q' <&1 >&2)
too

관련 정보