我正在尝试制作自己的linux外壳。我已修复bg命令它正在处理此代码:
if (strcmp(worte[0], "bg")==0){
pid_t pidnumber;
pidnumber=atoi(worte[1]);
printf("PID: %d", pidnumber);
kill(pidnumber, SIGCONT);
return 0;
}
但是,fg命令不能正常工作。当我输入“fg 12345”(12345是进程id)时,它会将该进程置于前台,但我不能用Ctrl-Z停止它,也不能用Ctrl-C。我的代码如下
if (strcmp(worte[0], "fg")==0){
pid_t pidnumber;
pidnumber=atoi(worte[1]);
tcsetpgrp(0, getpgid(pidnumber));
waitpid(getpgid(pidnumber), NULL, WUNTRACED);
tcsetpgrp(0, getpgid(shellpid));
return 0;
}
在代码中,worte[0]表示fg,worte1表示进程id(例如:12345)。谢谢你的帮助,我怎样才能解决我的问题。Please look at the image to see my problem obviously
最佳答案
试着忽略这个信号。
pid_t pidnumber;
pidnumber=atoi(worte[1]);
signal(SIGTTOU, SIG_IGN);
tcsetpgrp(0, getpgid(pidnumber));
signal(SIGTTOU, SIG_DFL);
waitpid(getpgid(pidnumber), NULL, WUNTRACED);
signal(SIGTTOU, SIG_IGN);
tcsetpgrp(0, getpgid(shellpid));
signal(SIGTTOU, SIG_DFL);