신호( )를 실험하는 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
아무것도 변경되지 않았습니다. 저도 시도해 보았지만 결과는 같았습니다.-f
exit 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에 대한 쓰기 중 하나가 차단되었음을 확인하시기 바랍니다. 이는 애플리케이션이 파이프에서 데이터를 가져오지 못한다는 의미입니다.