posix 쉘을 사용하여 하위 프로세스의 별도 입력 파일 설명자에 데이터 전달

posix 쉘을 사용하여 하위 프로세스의 별도 입력 파일 설명자에 데이터 전달

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. 그러나 대신 foostdout에서 확인하고 child()결코 종료되지 않습니다(분명히 데이터는 자식의 입력 파일 설명자에 들어 가지 않습니다).

고쳐 쓰다: 요청 시 사용 사례를 추가합니다.

루프에서는 루프를 통해 매번 해당 유틸리티를 재생성하지 않고 stdin을 읽는 유틸리티에 데이터를 보냅니다. 유틸리티는 루프를 통과할 때마다 다시 포크/실행되어야 하므로 비용이 많이 듭니다. 따라서... 유틸리티를 백그라운드 하위 프로세스(한 번만 실행)로 실행하고 하위 프로세스에 사용 가능한 입력 파일 설명자를 통해 상위 프로세스의 데이터를 보냅니다.

업데이트 2:

나는 정말로 mkfifo가 하는 일을 하려고 노력하고 있다고 생각합니다(부모의 출력 fd가 자식의 입력 fd에 연결되고 자식의 out fd가 부모의 in fd에 연결되는 입력/출력 fd 쌍을 만듭니다). ), 그러나 mkfifo는 사용할 수 없습니다(그리고 가능하다면 임시 파이프 파일은 없습니다. 즉, 익명의 파일 설명자만 사용됩니다).

답변1

관련 정보