如何处理迷你shell中的信号Ctrl + Z. C

时间:2011-02-03 20:16:24

标签: c linux

我正在尝试暂停该过程,但它不起作用。 这是代码的一部分。有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());    
}

2 个答案:

答案 0 :(得分:2)

不是为SIGTSTPSIGINT安装信号处理程序,而是将终端置于cfmakerawtcsetattr的原始模式。然后, ^ C ^ Z 将作为普通字符可读,这应该不那么麻烦。但是,您需要自己实施行编辑 - GNU readline是您的朋友。如需进一步的建议,请参阅Implementing a ShellJob ControlGNU 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;
}