여기 간단한 쉘을 작성하고 있습니다. 간단히 말해, 나는이 물건들을 (의사 코드)하고있다. :백그라운드 작업이 터미널에서 읽음
call fork()
if return value is zero: //child
setpgid(0,0)
if (foreground)
tcsetpgrp() //give this child access to terminal
reset all signal handlers messed up by parent
unblock all signals that are blocked by parent
execve()
else: //parent
if (foreground)
tcsetpgrp() //give child access to terminal
add this job to job list
unblock all signals
wait for this job to finish
tcsetpgrp() //get terminal access back
if (background)
add this job to job list
unblock all signals
내가 테스트하고 싶은 것은/bin/cat이다. 이제 포어 그라운드에서 실행하면이 셸이/bin/cat에서 잘 작동합니다. 그러나,/bin/cat &을 백그라운드에서 실행하도록 입력하면 입/출력 오류가 발생합니다. 내가 배운 것에 따르면 백그라운드 작업이 터미널에서 읽으려고 할 때 SIGTTIN이 터미널로 보내 져야합니다. 이상적으로,/bin/cat &을 입력하면 SIGTTIN에 의해 중지됩니다. "bg"명령을 사용하여 다시 시작하면 SIGTTIN에 의해 다시 중지됩니다.
나는 이것을 어떻게 구현할 수 있는지 혼란 스럽다. SIGTTIN이 OS에 의해 자동으로 전송 되나요? 아니면 직접 보내야합니까? 그 후자의 경우, 어떻게하면 아이가 터미널에서 읽을 것인지 아닌지 말할 수 있습니까?
감사합니다.