현재 프로세스를 보조 프로세스 / 자식으로 교체


10

P"Hello"를 받고 "Why?"를 출력 할 것으로 예상 되는 프로그램 이 있습니다. 기능을 제공하기 전에. 이 기능은 "Hello"와 대화를 시작하는 것이 일반적임을 잘 모르는 다른 프로그램에서 사용됩니다. 따라서 다음 P과 같이 작동 하는 래퍼를 작성하고 싶습니다 (zsh 구문).

coproc P
print -p Hello  # Send Hello to P
read -pr line   # Read what P has to say
[[ "$line" = "Why?" ]] && Replace current process with the coprocess.
echo Could not get P's attention.

사용 cat또는 ddReplace...일부 (뭔가 같은 것은 cat <&p &; exec cat >&p) 불필요한 버퍼링을 초래한다. 내 옵션은 무엇입니까?


zsh솔루션 을 원하십니까 bash? 또는 솔루션이 허용됩니까?
roaima

1
bash적용되지 않는 솔루션에 실망 zsh했지만 확실히 받아 들일 것입니다 ☺
Michaël

이 스크립트를 실행하는 다른 프로그램이 무엇인지 알고 있습니까? 유한 한 목록입니까, 아니면 숫자 일 수 있습니까? 분명히 다른 프로그램은 이것을 호출하기 위해 이것에 대해 알아야합니다.
Lizardx

나의 전형적인 사용은와 ssh그것의 옵션 ProxyCommand이었다.
Michaël

1
cat일반적으로 버퍼링하지 않습니다. 시스템에있는 경우을 시도하십시오 cat -u.
Stéphane Chazelas

답변:


1

언급 한 문제는 실제로 프로세스 를 교체하는 것이 아니라 기존 프로세스의 스트림을 교체하는 것 입니다. 목표는 프로세스와 약간 상호 작용 한 다음 입력 / 출력을 다른 연결된 스트림 쌍으로 넘기는 것입니다.

이것을 직접 할 수있는 방법은 없습니다 (적어도 쉘에서는; 프로세스 내에서는 dup2호출이 작동 할 수 있습니다). 스트림을 연결해야합니다. 즉 :

( echo Hello ; cat ) | P | ( read ; cat )

coproc귀하의 예와 같이 사용 하는 것도 좋습니다. 이 명령은 파일 디스크립터를 어레이에 저장하고 나중에이를 재 지정에 사용할 수 있습니다.

P가 연결된 입력 / 출력 스트림을 검사하고이를 기반으로 버퍼링을 결정하지 않는 한 추가 버퍼링을 유발하지 않아야합니다 (적어도 GNU cat에서는). 예를 들어, C 표준 라이브러리는 파일에 연결된 경우 stdout/에서 버퍼링을 활성화 stderr하지만 터미널에 연결된 경우에만 라인 버퍼링을 수행합니다.


-1

버퍼링을 피하기 위해 perl을 사용하여 아래 코드로 테스트 할 수 있습니다.

P의 샘플 버전

$ cat /tmp/P
#!/bin/bash
read input
if [[ $input = "Hello" ]]
then
    echo "Why?"
else
    exit 1
fi
echo "Got Hello from client, working ..."
sleep 10
echo "Need to read some input"
read x
echo "Got: $x"

랩퍼 프로그램

$ cat /tmp/wrapper 
#!/usr/bin/zsh
coproc /tmp/P
print -p Hello  # Send Hello to P
read -pr line   # Read what P has to say
if [[ "$line" = "Why?" ]]; then
    perl -e '$|=1;print $_ while(<>);' <& p &
    perl -e '$|=1;print $_ while(<>);' >& p
else
    echo "Could not get P's attention."
fi

시운전

$ /tmp/wrapper 
Got Hello from client, working ...
Need to read some input
hi there P!   <== Typed in at teminal
Got: hi there P!

dd ibs=1예를 들어을 사용하는 것과 같습니다 . 나는 이것으로 좋지 않다. 어떤 식으로, coproc에는 자체 버퍼링이 있으며 이것이 내가 사용하려는 것입니다.
Michaël
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.