posix 쉘에서 데이터를 백그라운드 하위 프로세스 파일 설명자에 전달하고 상위 프로세스에서 하위 프로세스의 출력을 처리하고 싶습니다.
mkfifo를 사용하지 말고 표준 posix 쉘 파일 설명자 복사만 사용하십시오. 프로세스 대체( )와 같은 POSIX 이외의 기능은 없습니다 <(cmd)
. 중간 파일이 없습니다. /dev/fd 또는 /dev/std{in,out,err} 또는 /proc/pid가 없습니다.
다음과 같은 것입니다(이것은 작동하지 않으므로 내 개념과 그에 따른 일부 주석 설명이 매우 혼란스럽습니다).
child()
{
sed '1s|^|child: |;q' # prepend 'child: ' to first input line and quit
}
exec 4>&1 # open file descriptor 4 duplicated as stdout
# give the shell some time to start the child, then send data to child via fd 4
{ sleep 2; echo foo >&4; } &
out=$(child 4<&0) # connect fd 4 to stdin in child process
echo "out: $out"
'child: foo'
나는 그것을 보고 싶었습니다 out
. 그러나 대신 foo
stdout에서 확인하고 child()
결코 종료되지 않습니다(분명히 데이터는 자식의 입력 파일 설명자에 들어 가지 않습니다).
고쳐 쓰다: 요청 시 사용 사례를 추가합니다.
루프에서는 루프를 통해 매번 해당 유틸리티를 재생성하지 않고 stdin을 읽는 유틸리티에 데이터를 보냅니다. 유틸리티는 루프를 통과할 때마다 다시 포크/실행되어야 하므로 비용이 많이 듭니다. 따라서... 유틸리티를 백그라운드 하위 프로세스(한 번만 실행)로 실행하고 하위 프로세스에 사용 가능한 입력 파일 설명자를 통해 상위 프로세스의 데이터를 보냅니다.
업데이트 2:
나는 정말로 mkfifo가 하는 일을 하려고 노력하고 있다고 생각합니다(부모의 출력 fd가 자식의 입력 fd에 연결되고 자식의 out fd가 부모의 in fd에 연결되는 입력/출력 fd 쌍을 만듭니다). ), 그러나 mkfifo는 사용할 수 없습니다(그리고 가능하다면 임시 파이프 파일은 없습니다. 즉, 익명의 파일 설명자만 사용됩니다).