我正在尝试暂停该过程,但它不起作用。 这是代码的一部分。有Ctrl + Z和Ctrl + C. Ctrl + C正在运行。我无法理解Z为什么不起作用。 (实际代码):
//ctrl+Z
void sigstop(int p){
signal(SIGTSTP,&sigstop);
kill(my_pid,SIGSTOP);
fflush(stdout);
}
// Ctrl+C
void sigkill(int p){
signal(SIGINT,&sigkill);
kill(my_pid,SIGKILL);
fflush(stdout);
}
主要方法中的代码:
...
my_pid = fork();
if (my_pid == 0) {
signal(SIGTSTP,&sigstop); //for Ctrl+Z
signal(SIGINT,&sigkill); //for Ctrl+C
checkCommand();
execvp(argv[0], argv);
exit(getpid());
}
答案 0 :(得分:2)
不是为SIGTSTP
和SIGINT
安装信号处理程序,而是将终端置于cfmakeraw
或tcsetattr
的原始模式。然后, ^ C 和 ^ Z 将作为普通字符可读,这应该不那么麻烦。但是,您需要自己实施行编辑 - GNU readline是您的朋友。如需进一步的建议,请参阅Implementing a Shell的Job Control和GNU C Library Manual部分。 (您可以放心地忽略它试图警告您内核可能不支持作业控制的部分 - 如果有人仍在使用那些系统之一,他们只能责怪自己它)。
答案 1 :(得分:0)
我认为在sigkill函数中调用kill(),只是开始一个无限的递归循环,其中kill()再次调用sigkill函数,该函数调用kill(),再次调用sigkill函数......等等。而不是调用kill(),设置一个全局布尔变量并在main函数中检查它。如果设置了这个全局布尔变量,则只需正常退出。
类似的东西:
volatile bool gTerminate = false;
void sigkill(int p)
{
gTerminate = true;
signal(SIGINT, &sigkill);
}
int main(...)
{
//initialization stuff...
while( !gTerminate )
{
//do stuff
}
return -1;
}