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


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또는 dd의 Replace...일부 (뭔가 같은 것은 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.