可能重复:
After suspending child process with SIGTSTP, shell not responding
我正在用C编写一个基本shell,我正在努力暂停子进程。
应该有两种方法可以做到这一点。
一种是当我在输入中输入ps&
时,最后输入&
,我会调用kill
(pid
,child_pid
然后我将孩子的pid
放入bg
进程的数组中。
第二个是当我在当前正在运行的子流程上按 CTRL - Z 时。
我认为我的信号处理程序是正确的,并且我的子进程正在挂起,但在此之后,终端应该返回到父进程并且没有发生。
孩子被暂停,但我的shell不再注册任何输入或输出。 tcsetpgrp()
似乎没有帮助。
这是SIGTSTP
的shell代码中的信号处理程序:
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?我该怎么做?
谢谢!