C 阻止信号

问题描述 投票:0回答:2

我正在尝试编写一个类似 shell 的应用程序,并与信号阻塞作斗争。我想禁用/阻止一些信号,如 SIGINT 或 SIGQUIT,这样当用户按 Ctrl+C 或 Ctrl+\ 时,什么也不会发生。

我做了一些研究,并且能够通过使用

signal(SIGQUIT, SIG_IGN)
sigaction()
来做到这一点。

我的问题是信号没有完全屏蔽。当我在应用程序中按 Ctrl+\ 多次时,它不会按预期退出,但也会显示此

^\

另外,因为我使用

readline()
来捕获用户的输入,所以当我使用 Ctrl+\ 并按 Enter 时,会出现一个奇怪的换行符。

c shell signals
2个回答
1
投票

看来您正确屏蔽了信号。当您禁用信号时,当您按

Ctrl+\
时,您的终端会将其发送到您的应用程序。与当您在键盘上按“A”时发送
a
的方式相同,但与“A”不同,
Ctrl+\
不会生成任何可打印字符,您的终端无法直接打印它。
^\
基本上是该不可打印字符的特殊表示法。您还会在
readline()
结果中得到该“字符”,这就是我们看到的奇怪的事情。


0
投票

要禁用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 操作系统中测试了这段代码,没有任何问题。

© www.soinside.com 2019 - 2024. All rights reserved.