Bash 스크립트의 명명된 파이프

Bash 스크립트의 명명된 파이프

신호( )를 실험하는 C 프로그램이 있습니다 ./signal. 표준 입력을 처리하고 a를 읽을 때 종료되며 'q'신호에 반응합니다.

명명된 파이프(fifo)를 사용하여 bash 스크립트를 통해 테스트하고 싶습니다. 현재 나는 이것을 가지고 있습니다 :

#!/bin/bash

rm mypipe
mkfifo mypipe

./signal <> mypipe &

echo f > mypipe
echo hello
echo f > mypipe
echo q > mypipe

rm mypipe

이를 실행하면 프로그램의 예상 출력을 볼 수 있지만 echo hello입력에 대한 프로그램의 두 응답 사이에는 출력이 나타나지 않습니다 'f'.

고쳐 쓰다

죄송합니다. 이전 버전을 붙여넣었습니다. 앰퍼샌드는 여기에 있습니다. ./signal <> mypipe &위의 코드를 수정했습니다.

업데이트 2

roaima가 제안한 대로 and를 추가했지만 wait아무것도 변경되지 않았습니다. 저도 시도해 보았지만 결과는 같았습니다.-fexit 0./signal < mypipe &

답변1

&백그라운드에서 명령을 실행하도록 쉘에 지시합니다 . 귀하의 스크립트는 mkfifo mypipe파이프 장치를 생성하기 위해 백그라운드에서 실행되는데, 이는 나에게 무의미해 보이지만 ./signal <> mypipe백그라운드에서는 실행되지 않습니다. 이 C 프로그램이 분기되어 상위 프로그램이 즉시 반환되도록 허용하지 않는 한, 스크립트가 계속되는 것을 방지하고 종료될 echo때까지 후속 명령에 도달하지 않습니다.signal

#!/bin/bash

# Create the pipe
rm -f mypipe
mkfifo mypipe

# Run the application in the background
./signal <> mypipe &

# Apply tests
echo f > mypipe
echo hello
echo f > mypipe
echo q > mypipe

# Wait for the application to terminate (a no-op if it's already gone)
wait

# Tidy up
rm -f mypipe
exit 0

귀하의 프로그램(및 이 수정된 프로그램)은 FIFO에서 읽지 않으므로 signal응용 프로그램이 파이프에 쓰는 경우 차단될 수 있습니다.

테스트 도구가 예상대로 작동하지 않는 경우 디버깅을 활성화하세요.

bash -x testscript    # run the script

FIFO에 대한 쓰기 중 하나가 차단되었음을 확인하시기 바랍니다. 이는 애플리케이션이 파이프에서 데이터를 가져오지 못한다는 의미입니다.

관련 정보