대화형 프로그램 stdin 및 stdout(게임을 플레이하기 위한 봇 프로그램 생성)

대화형 프로그램 stdin 및 stdout(게임을 플레이하기 위한 봇 프로그램 생성)

설정: 소스 코드가 없기 때문에 "편집할 수 없는" 실행 파일이 있습니다. 프로그램을 실행하면 계산할 숫자를 제공하는 게임이 표시되고 stdout, 계산이 끝나면 대답을 제공할 수 stdin있으며 계산이 올바른지 알려줍니다. 그런 다음 새로운 계산을 받고 모든 것이 반복됩니다.

질문: 이 게임을 수동으로 플레이할 수 있지만 프로그래밍 방식으로 자동화하고 싶습니다. 시스템에서 사용할 수 있는 도구는 Bash및 입니다 C-compiler. 이 프로그램과 상호작용하는 가장 쉬운 방법은 무엇입니까?

지금까지 내가 한 일: 저는 파이프를 살펴보고 C프로세스를 분기하고 파이프를 사용하여 두 프로세스 간에 통신하는 작은 프로그램을 실행했습니다. (이 같은프로그램). 하지만 하위 프로세스에서 외부 바이너리를 호출하면 작동하게 할 수 없습니다.

답변1

파이프와 FIFO를 사용하여 이를 수행할 수 있습니다.

예를 들어, 이것은 내 테스트 스크립트입니다 blackbox.sh.

#!/bin/bash

# Here i output the value to be added.
echo "10 30"

# Here i read the result and depending on it, write good or not good in a file
read result
if [ "${result}" -eq 40 ]; then
    echo good > result.txt
else
    echo not good > result.txt
fi

수동으로 실행:

$ ./blackbox.sh 
10 30 <~~~~ Script output
40 <~~~~~~~ My input
$ cat result.txt 
good
$ 

mkfifo coin이제 다음 줄을 사용하여 FIFO를 생성하고 다시 실행합니다.

$ rm result.txt && cat coin |./blackbox.sh | ( read a b ; echo $((a+b)) > coin )
$ cat result.txt 
good

알아채다:

  • FIFO가 읽기 위해 열리지 않는 한 FIFO에 대한 모든 쓰기는 차단됩니다.
  • 분명히 's의 출력을 blackbox.sh무언가로 파이프하면 그것을 볼 수 없게 될 것입니다.
  • blackbox.sh의 출력을 쉽게 구문 분석할 수 있는 간단한 예를 선택했습니다. 필요에 따라 조정할 수 있습니다.
  • $(( ))Bash에서 산술 연산을 허용합니다.

관련 정보