我在C編寫了一個基本的shell,而且我正在努力暫停一個子進程。在用SIGTSTP暫停子進程之後,shell沒有響應
我認爲我的信號處理程序是正確的,並且我的子進程正在暫停,但是在此之後,終端應該返回到父進程並且沒有發生。
孩子被暫停,但我的外殼沒有註冊任何輸入或輸出了。 tcsetpgrp()似乎沒有幫助。
這裏是我的信號處理程序在我的shell代碼爲SIGTSTP:
void suspend(int sig) {
pid_t pid;
sigset_t mask;
//mpid is the pgid of this shell.
tcsetpgrp(STDIN_FILENO, mpid);
tcsetpgrp(STDOUT_FILENO, mpid);
sigemptyset(&mask);
sigaddset(&mask, SIGTSTP);
sigprocmask(SIG_UNBLOCK, &mask, NULL);
signal(SIGTSTP, SIG_DFL);
//active.pid is the pid of the child currently in the fg.
if (active.pid != 0) {
kill(active.pid, SIGTSTP);
}
else{
//if this code is being run in the child, child calls SIGTSTP on itself.
pid = getpid();
if (pid != 0 && pid != mpid){
kill(pid, SIGTSTP);
}
}
signal(SIGTSTP, suspend);
}
誰能告訴我,我做錯了什麼?
我是否將我的shell與孩子一起掛起,我是否需要以某種方式將stdin和stdout返回給shell?我將如何做到這一點?
謝謝!
感謝您的回覆。我嘗試了你說的話,但是當我拿走我的信號處理程序時,終端會暫停父母並返回bash。我需要父母繼續跑步。 – user1710304
這顯然是錯誤的,沒有捕獲SIGTSTP肯定會導致他的shell暫停,並且會讓子進程繼續。 他需要抓住它,所以他的外殼不會中止。 我現在面臨着同樣的問題,他現在面臨早些時候 – Fingolfin
@AdelQodmani,當您按Ctrl-Z時,只有終端的前臺進程組收到SIGTSTP。正在等待其啓動進程終止的shell是在一個進程組中,該進程組不是終端的前臺進程組。如果你喜歡,你可以_IGNORE_ SIGTSTP,這可能是大多數shell所做的。我的觀點是你需要使用終端的前臺進程組。 –