C块信号

ohtdti5x  于 2023-10-16  发布在  其他
关注(0)|答案(2)|浏览(85)

我试图写一个shell样的应用程序和斗争的信号阻塞。我想禁用/阻止一些信号,如SIGINT或SIGQUIT,所以当用户按Ctrl+C或Ctrl+\,什么也不会发生。
我做了一些研究,并能够通过使用signal(SIGQUIT, SIG_IGN)sigaction()来做到这一点。
我的问题是信号没有完全被屏蔽。当我在应用程序中按Ctrl+\几次时,它不会像预期的那样退出,但也会显示这个^\
另外,因为我使用readline()来捕获用户的输入,所以当我使用Ctrl+\并按Enter键时,会出现一个奇怪的换行符。

zbdgwd5y

zbdgwd5y1#

看来你屏蔽信号很到位当您禁用信号时,当您按下Ctrl+\时,您的终端将其发送到您的应用程序。与a的发送方式相同,当您按键盘上的“A”时,但与“A”不同,Ctrl+\不会生成任何可打印字符,您的终端无法直接打印它。^\基本上是不可打印字符的特殊符号。你也会在readline()结果中得到那个“字符”,这是你看到的奇怪的事情。

3xiyfsfu

3xiyfsfu2#

要在C语言中禁用Ctrl+C和Ctrl+Z,可以使用以下函数:

#include <termios.h>

void block_signals ()
{
    struct termios old_termios, new_termios;

    tcgetattr(STDIN_FILENO, &old_termios);
    new_termios = old_termios;

    new_termios.c_cc[VINTR] = 0; // Ctrl+C
    new_termios.c_cc[VSUSP] = 0; // Ctrl+Z

    // Set the new terminal attributes
    tcsetattr(STDIN_FILENO, TCSANOW, &new_termios);
}

我已经在GNU Linux操作系统中用GCC测试了这段代码,没有任何问题。

相关问题