단일 파일 설명자에 대한 읽기 및 쓰기를 다른 위치로 보내는 방법은 무엇입니까?

단일 파일 설명자에 대한 읽기 및 쓰기를 다른 위치로 보내는 방법은 무엇입니까?

foofd 0에서 입력을 읽고 출력을 fd 0에 쓰는 Linux 실행 파일이 있습니다 (아니요FD1). 이는 터미널에서 대화형으로 사용하는 데 적합합니다.

쉘 명령줄에서 한 파일에서 fd 0을 읽고 다른 파일에는 fd 0을 쓰도록 이 프로그램을 어떻게 실행합니까?

내가 생각할 수 있는 가장 좋은 것은 $ goo input.txt output.txt | foo어딘가에 도우미가 goo있는 것인데 기존 도우미가 있는지도 모르고 설정 중인 파이프가 양방향인지도 모르겠습니다 |.

답변1

사용 socat(버전 2 이상):

socat 'system:cat input.txt & cat > output.txt,commtype=socketpair' \
      'system:foo,nofork'

또는 더 나은 방법은 다음과 같습니다.

socat 'CREATE:output.txt%OPEN:input.txt' 'system:foo,commtype=socketpair'

우리는 양방향을 사용하고 있습니다 socketpair(Linux의 파이프는 양방향이 아닙니다). 또 다른 옵션은 위의 방법을 통해 의사 터미널(양방향)을 사용하는 것입니다 commtype=pty. 터미널과 통신하려는 경우 foo이 방법이 더 나은 방법일 수 있습니다 .

또는 다음과 같은 socketpair방법을 구현할 수 있습니다 perl.

perl -MSocket -e '
  socketpair(A, B, AF_UNIX, SOCK_STREAM, PF_UNSPEC);
  if (fork) {
    close A;
    if (fork) {
      open STDOUT, ">&B";
      exec("cat", "input.txt")
    }
    open STDIN, "<&B";
    open STDOUT, ">output.txt";
    exec("cat")
  }
  close B;
  open STDIN, "<&A";
  exec "foo"'

(여기서 빠른 개념 증명으로 오류 검사를 추가하고 많은 프로세스를 사용하지 않고 실행을 방지하여 더 효율적으로 만들 수 있습니다 cat.)

관련 정보