알다시피, 다이어그램이 묘사 할 때 반복적 인 피드백 루프가 필요하다는 것을 확신하지는 못합니다. 아마도 coprocesses 사이에 지속적인 파이프 라인을 사용할 수 있습니다 . 그런 다음 다시 큰 차이가 없을 수 있습니다. 일단 코 프로세스에서 행을 열면 일반적인 스타일 루프를 구현하여 일반적인 정보를 작성하지 않고 정보를 쓰고 정보를 읽습니다.
우선, 그것은 bc
당신을위한 공동 프로세스의 주요 후보입니다. 에서 bc
당신이 할 수있는 define
귀하의 의사에 꽤 많이 물어 무엇을 할 수있는 기능입니다. 예를 들어,이를 수행하는 매우 간단한 함수는 다음과 같습니다.
printf '%s()\n' b c a |
3<&0 <&- bc -l <<\IN <&3
a=1; b=0; c=0;
define a(){ "a="; return (a = c+1); }
define b(){ "b="; return (b = 3*a); }
define c(){ "c="; return (c = s(b)); }
IN
... 인쇄 할 것이다 ...
b=3
c=.14112000805986722210
a=1.14112000805986722210
그러나 물론 지속 되지 않습니다 . printf
파이프 를 담당하는 서브 쉘 이 종료 되 자마자 (printf
a()\n
파이프에 쓴 직후 ) 파이프가 끊어지고 bc
입력이 닫히고 종료됩니다. 그것은 거의 유용하지 않습니다.
@derobert는 이미 유틸리티를 사용하여 명명 된 파이프 파일을 만들어서 FIFO를 언급했습니다 . 시스템 커널은 파일 시스템 항목을 양쪽 끝에 연결한다는 점을 제외하면 본질적으로 파이프이기도합니다. 이것들은 매우 유용하지만 파일 시스템에서 스누핑 될 위험없이 파이프를 가질 수 있다면 더 좋을 것입니다.mkfifo
그것이 일어날 때, 쉘은 이것을 많이합니다. 프로세스 대체 를 구현하는 쉘을 사용하는 경우 , 통신 할 수있는 백그라운드 프로세스에 지정할 수 있는 지속적인 파이프 를 얻을 수있는 매우 간단한 방법 이 있습니다.
예 bash
를 들어, 프로세스 대체가 어떻게 작동하는지 확인할 수 있습니다.
bash -cx ': <(:)'
+ : /dev/fd/63
당신은 그것이 실제로 대체 인 것을 본다 . 쉘은 확장하는 동안 파이프 링크 에 대한 경로에 해당하는 값을 대체합니다 . 이를 활용할 수 있습니다. 대체 자체 내에서 실행되는 프로세스와 통신하기 위해 해당 파이프를 사용하도록 제한 할 필요는 없습니다 ...()
bash -c '
eval "exec 3<>"<(:) "4<>"<(:)
cat <&4 >&3 &
echo hey cat >&4
read hiback <&3
echo "$hiback" here'
... 인쇄 ...
hey cat here
이제는 다른 쉘이 다른 방식으로 코 프로세스를 수행한다는 것을 알고 있습니다. 그리고 bash
하나를 설정하기위한 특정 구문이 있습니다 (아마도 하나를위한 zsh
것입니다) . 난 그냥 당신이 모두에서 두서없는 장문의 모든없이 거의 같은 일을 위의 구문을 사용할 수 있다는 것을 알고 bash
그리고 zsh
- 당신은에 매우 비슷한 일을 할 수 dash
와 busybox ash
여기-문서와 같은 목적을 달성하기 위해 (때문에 dash
그리고 busybox
여기 - 할 다른 두 가지처럼 임시 파일이 아닌 파이프가있는 문서) .
따라서에 적용하면 bc
...
eval "exec 3<>"<(:) "4<>"<(:)
bc -l <<\INIT <&4 >&3 &
a=1; b=0; c=0;
define a(){ "a="; return (a = c+1); }
define b(){ "b="; return (b = 3*a); }
define c(){ "c="; return (c = s(b)); }
INIT
export BCOUT=3 BCIN=4 BCPID="$!"
... 그것은 어려운 부분입니다. 그리고 이것은 재미있는 부분입니다 ...
set --
until [ "$#" -eq 10 ]
do printf '%s()\n' b c a >&"$BCIN"
set "$@" "$(head -n 3 <&"$BCOUT")"
done; printf %s\\n "$@"
... 인쇄 ...
b=3
c=.14112000805986722210
a=1.14112000805986722210
#...24 more lines...
b=3.92307618030433853649
c=-.70433330413228041035
a=.29566669586771958965
... 그리고 여전히 실행 중입니다 ...
echo a >&"$BCIN"
read a <&"$BCOUT"
echo "$a"
... 단지 나에게의 마지막 값을 얻을 수있는 bc
의를 a
대신 호출하는 대신 a()
IT 및 인쇄를 증가시키는 기능을 ...
.29566669586771958965
실제로 그것을 죽이고 IPC 파이프를 찢을 때까지 계속 실행됩니다 ...
kill "$BCPID"; exec 3>&- 4>&-
unset BCPID BCIN BCOUT