bash: fifo에서 전체 레코드를 읽습니다.

bash: fifo에서 전체 레코드를 읽습니다.

FIFO를 통해 프로세스 B에서 프로세스 A로 명령을 보내고 싶습니다.

명령은 단어나 문장이지만 "\n"으로 끝나는 줄에 완전히 포함되지만 다른 문자로 끝나는 여러 줄 레코드일 수도 있습니다.

내가 시도한 코드의 관련 부분은 다음과 같습니다.

프로세스 A:

$ mkfifo ff
$ read x < ff

프로세스 B: (다른 터미널 창에서)

$ echo -n "cmd"   > ff
$ echo -n " arg1" > ff
$ echo -n " arg2" > ff
 ...    
$ echo    " argN" > ff

read그러나 매뉴얼 페이지에 기본적으로 값이 반환되고 해당 옵션을 사용하지 않으면 종료 줄이 읽혀진다고 나와 있는데도 불구하고 일어나는 일입니다 .cmdbash\n-d delim

그래서 다음에는 -d delim명시적으로 지정하려고 했습니다.

$ read -d "\n" x < f`

여전히 같은 결과입니다.

echo -nFIFO의 파일 "설명자"를 닫는 것이 가능합니까 ?

Ubuntu 18.04에서 bash 4.4.x를 사용하고 있습니다.

답변1

네, 정확히 그런 일이 일어났습니다:

$ mkfifo p
$ while :; do cat p ; done > /dev/null  & 
$ strace -etrace=open,close bash -c 'echo -n foo > p; echo bar > p' |& grep '"p"' -A1
open("p", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
close(3)                                = 0
--
open("p", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
close(3)                                = 0

리디렉션은 이를 설정하는 개별 명령이 실행되는 동안에만 적용됩니다. 쓰기 측의 해결 방법은 a) 복합 블록을 사용하여 명령을 그룹화하거나 b) exec스크립트 전체 기간 동안(또는 닫힐 때까지) 열린 파일 설명자를 사용하는 것입니다.

ㅏ)

{ echo -n foo; echo bar; } > p

(함수에 명령을 넣고 함수를 호출할 때 리디렉션을 사용할 수도 있습니다.)

비)

exec 3>p
echo -n foo >&3
echo bar    >&3
exec 3>&-         # to explicitly close it

읽는 쪽에서 문제를 해결하려면 read얻은 문자열을 반복하고 연결해야 합니다. 부분적으로 라인이 아닌 파일 끝 조건을 명시적으로 건너뛰고 싶기 때문에 종료 코드를 사용하여 read유용한 작업을 수행할 수 없습니다.

관련 정보