我正在尝试编写一个类似 shell 的应用程序,并与信号阻塞作斗争。我想禁用/阻止一些信号,如 SIGINT 或 SIGQUIT,这样当用户按 Ctrl+C 或 Ctrl+\ 时,什么也不会发生。
我做了一些研究,并且能够通过使用
signal(SIGQUIT, SIG_IGN)
或 sigaction()
来做到这一点。
我的问题是信号没有完全屏蔽。当我在应用程序中按 Ctrl+\ 多次时,它不会按预期退出,但也会显示此
^\
。
另外,因为我使用
readline()
来捕获用户的输入,所以当我使用 Ctrl+\ 并按 Enter 时,会出现一个奇怪的换行符。
看来您正确屏蔽了信号。当您禁用信号时,当您按
Ctrl+\
时,您的终端会将其发送到您的应用程序。与当您在键盘上按“A”时发送 a
的方式相同,但与“A”不同,Ctrl+\
不会生成任何可打印字符,您的终端无法直接打印它。 ^\
基本上是该不可打印字符的特殊表示法。您还会在 readline()
结果中得到该“字符”,这就是我们看到的奇怪的事情。
要禁用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 );
}
我已经在带有 GCC 的 GNU Linux 操作系统中测试了这段代码,没有任何问题。