ctrl-x 在终端中使用时会发送哪个信号?

Posted

技术标签:

【中文标题】ctrl-x 在终端中使用时会发送哪个信号?【英文标题】:Which signal does ctrl-x send when used in a terminal? 【发布时间】:2011-10-09 12:09:19 【问题描述】:

在 Linux/Unix 上有信号。 CtrlC 之一(SIGINT)对我来说是显而易见的。 现在,在其他一些应用程序中有通过 CtrlX 的信号?! 这甚至是一个信号还是它会产生一个转义序列? 还有什么我可以用作类似于 CtrlC ( CtrlV, CtrlX ...)?

如果有人有线索,我对 C 的熟悉比对 bash 的要多,但是两种语言的答案都值得赞赏!

【问题讨论】:

也许不是一个完整的列表:http://www.cdrinfo.com/Sections/Reviews/Specific.aspx?ArticleId=19672 【参考方案1】:

获取所有终端控制字符分配:

stty -a

【讨论】:

【参考方案2】:

可能有误会。 CtrlC 不产生信号。完全可以在任何地方按 CtrlC,不会发生任何坏事(例如在每个文本编辑器或文字处理器中,这是“复制”)。

但是,当您在 shell 中运行程序时,您的按键实际上会进入 shell,而不是进入您的程序。 shell 会将所有内容(几乎)转发到程序的标准输入,并将来自标准输出的任何内容转发到终端或另一个进程或文件(如果您使用管道或重定向)。

如果 shell 看到你按下 CtrlC,那么 shell 会发送中断信号。但这实际上只是 shell 所做的事情,而不是因为组合键而神奇地发生的事情。

关于CtrlX,你的意思可能是CtrlZ。这会停止一个进程,并且 shell 会输出一个数字,您可以将其与 fg 一起使用以使其再次运行。

【讨论】:

Ctrl-C 导致发送 SIGINT,而不是 SIGTERM。此外,当按下 break 组合时,发送 SIGINT 的是终端,而不是 shell(参见 BRKINT 标志)。我认为你对 Ctrl-C 被 shell 翻译是对的。 我的错,当然……如果它是 SIGTERM,你不能阻止(或处理)它,显然你可以。 我知道 ctrl-C 不是信号。如果我把它写出来,没人能理解这个问题,而且写很多花哨的东西太简单了。 @Ben Voigt:对我来说,this comment 读起来好像真的是 bash 得到 Ctrl-C,但我当然可能错了。不喜欢它真的很重要。 :-) @Damon:可以处理 SIGTERM。也许您正在考虑 SIGKILL?引发 SIGINT 的组合键有两种:Ctrl-C 由 shell 处理,Ctrl+Break 由终端处理。【参考方案3】:

来自Wikipedia

Ctrlx Ctrle :编辑 $EDITOR 程序中的当前行,或 vi 如果未定义。

Ctrlx Ctrlr :读入 inputrc 文件的内容,然后 合并在那里找到的任何绑定或变量分配。

Ctrlx Ctrlu :增量撤消,每行单独记住。

Ctrlx Ctrlv :显示当前实例的版本信息 bash。

Ctrlx Ctrlx :将光标与其旧位置交替。 (C-x, 因为 x 具有交叉形状)。

Ctrlx 的另一个用途是在 shell 中键入命令时扩展 *

假设你有:

$ ls *

Ctrlx 然后按 * 会将 * 扩展到当前目录中的所有项目,如下所示:

$ ls dir1 dir2 file1 file2 file3`

我上面介绍的用法也可以参考this topic on SuperUser。

【讨论】:

【参考方案4】:

终端为某些按键序列赋予特殊含义。这包括删除一个字符,删除到行首( CtrlU ),...

具体来说,当终端ISIG本地模式开启时:

VINTR(通常是CtrlC)生成SIGINT(被用户打断)。 VQUIT(通常是 Ctrl\)生成一个 SIGQUIT(类似于 SIGINT,但也是转储核心)。 VSUSP(通常是 CtrlZ)生成 SIGTSTP(通过终端 I/O 停止)。 VDSUSP(在某些系统上,而不是在 Linux 上)在程序尝试读取它时会生成一个 SIGTSTP

以上是可配置的。这记录在 termios(3) 联机帮助页中。

【讨论】:

【参考方案5】:

在 Linux/Unix 上有信号。 Ctrl+C 之一(SIGINT)对我来说很明显......

如果您需要系统上可用的信号列表,那么signum.h 会很有帮助。以下来自 Debian 7.3:

/* Signals.  */
#define SIGHUP      1   /* Hangup (POSIX).  */
#define SIGINT      2   /* Interrupt (ANSI).  */
#define SIGQUIT     3   /* Quit (POSIX).  */
#define SIGILL      4   /* Illegal instruction (ANSI).  */
#define SIGTRAP     5   /* Trace trap (POSIX).  */
#define SIGABRT     6   /* Abort (ANSI).  */
#define SIGIOT      6   /* IOT trap (4.2 BSD).  */
#define SIGBUS      7   /* BUS error (4.2 BSD).  */
#define SIGFPE      8   /* Floating-point exception (ANSI).  */
#define SIGKILL     9   /* Kill, unblockable (POSIX).  */
#define SIGUSR1     10  /* User-defined signal 1 (POSIX).  */
#define SIGSEGV     11  /* Segmentation violation (ANSI).  */
#define SIGUSR2     12  /* User-defined signal 2 (POSIX).  */
#define SIGPIPE     13  /* Broken pipe (POSIX).  */
#define SIGALRM     14  /* Alarm clock (POSIX).  */
#define SIGTERM     15  /* Termination (ANSI).  */
#define SIGSTKFLT   16  /* Stack fault.  */
#define SIGCLD      SIGCHLD /* Same as SIGCHLD (System V).  */
#define SIGCHLD     17  /* Child status has changed (POSIX).  */
#define SIGCONT     18  /* Continue (POSIX).  */
#define SIGSTOP     19  /* Stop, unblockable (POSIX).  */
#define SIGTSTP     20  /* Keyboard stop (POSIX).  */
#define SIGTTIN     21  /* Background read from tty (POSIX).  */
#define SIGTTOU     22  /* Background write to tty (POSIX).  */
#define SIGURG      23  /* Urgent condition on socket (4.2 BSD).  */
#define SIGXCPU     24  /* CPU limit exceeded (4.2 BSD).  */
#define SIGXFSZ     25  /* File size limit exceeded (4.2 BSD).  */
#define SIGVTALRM   26  /* Virtual alarm clock (4.2 BSD).  */
#define SIGPROF     27  /* Profiling alarm clock (4.2 BSD).  */
#define SIGWINCH    28  /* Window size change (4.3 BSD, Sun).  */
#define SIGPOLL     SIGIO   /* Pollable event occurred (System V).  */
#define SIGIO       29  /* I/O now possible (4.2 BSD).  */
#define SIGPWR      30  /* Power failure restart (System V).  */
#define SIGSYS      31  /* Bad system call.  */
#define SIGUNUSED   31

#define _NSIG       65  /* Biggest signal number + 1
                   (including real-time signals).  */

#define SIGRTMIN        (__libc_current_sigrtmin ())
#define SIGRTMAX        (__libc_current_sigrtmax ())

【讨论】:

以上是关于ctrl-x 在终端中使用时会发送哪个信号?的主要内容,如果未能解决你的问题,请参考以下文章

实验七 信号

实验七 信号

实验七 信号

实验七 信号

进程间通讯:信号

实验七信号