쉘 프로그램은 문자 드라이버를 열고 기다립니다.

쉘 프로그램은 문자 드라이버를 열고 기다립니다.

이 질문의 동기는 내가 감시 장치의 기능을 테스트하고 있고 종료될 때까지 아무것도 하지 않고 기다리지 않고 장치를 열 수 있는 셸 내장 명령이 있는지 궁금하기 때문입니다. Echo/touch그냥 작업을 수행한 후 바로 장치를 켜고 끄는 것 같습니다. Cat작동하지 않는 것 같습니다.

나는 C 응용 프로그램을 사용하여 동일한 작업을 수행하고 있지만 쉘 스크립트에 이에 대한 몇 가지 조항이 있는지 알고 싶습니다.

답변1

Bourne 쉘에서는

exec 3< "$device"

셸의 파일 설명자 3에서 장치를 엽니다.

이는 C와 거의 동일합니다.

fd = open(device, O_RDONLY);
if (fd < 0) handler_error(...);
if (fd != 3) { dup2(fd, 3); close(fd); }

(또한 해당 fd에 ksh93하나를 만들었습니다 ).fcntl(3, F_SETFD, FD_CLOEXEC)

닫으려면:exec 3<&-

zsh, ksh93및 에서는 bash다음 fd = open(device, O_RDONLY)과 같이 작성할 수도 있습니다.

exec {fd}< "$device"

여기서 파일 설명자는 9보다 큰 첫 번째 자유 설명자가 되며 $fd.

닫으려면:exec {fd}<&-

for , for 및 for <로 바꿉니다 .>O_WRONLY|O_CREAT|O_TRUNC<>O_RDWR|O_CREAT>>O_WRONLY|O_CREAT|O_APPEND

zsh아직 하나 있어요sysopen내장( zsh/system모듈 내)여기서 플래그를 정확하게 지정할 수 있습니다.

POSIX 호환 쉘에서는 다음 exec과 같습니다.특수 내장, 파일을 열 수 없는 경우 비대화형(스크립트 종료)일 때 치명적인 오류입니다. command이 명령을 사용하여 비활성화 할 수 있습니다 .

if command exec 3< "$device"; then
  do-what-you-need-to-do
else
  handle-the-error-yourself
fi

답변2

while sleep 3600; do :; done >/dev/your_watchdog

장치가 쓰기 전용 모드로 열려야 한다는 echo사실을 (작동 및 실패를 통해) 수집했습니다 .touchcat

관련 정보