2012-10-27 3 views
2

여기 간단한 쉘을 작성하고 있습니다. 간단히 말해, 나는이 물건들을 (의사 코드)하고있다. :백그라운드 작업이 터미널에서 읽음

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에 의해 자동으로 전송 되나요? 아니면 직접 보내야합니까? 그 후자의 경우, 어떻게하면 아이가 터미널에서 읽을 것인지 아닌지 말할 수 있습니까?

감사합니다.

답변

0

마지막으로 가져 왔습니다. 부모가이 신호를 무시했기 때문에 SIGTTIN에 대한 응답이 없습니다. 자식에서 모든 신호 핸들러는 SIGTTIN 신호를 포함하여 기본값으로 설정되어야합니다.

관련 문제