我正在创建自己的 shell,我想在任何 Linux 发行版上的任何用户按 ctrl+c 时禁用 ^C。
我不需要处理 SIGINT 信号,我已经处理过了,因为不要在 ctrl+c 上停止程序。我只想知道如何隐藏这两个字符^C。
在我的程序开始时是否有任何要调用的函数或要设置的环境变量?
编辑
int a = fork();
if (!a) {
char *cmd[] = {"/bin/stty", 0 };
char *cmd_args[] = {" ", "-echoctl", 0};
execve(cmd[0], cmd_args, env);
}
试过了。它在 ctrl-c 上删除了我的 ^C 但它仍然显示一个方形字符,就像无法显示该字符一样。好像是EOT(003 ascii)
最佳答案
^C
来自Linux终端驱动的echo
下面是一个C语言的示例程序。它首先禁用保存当前设置,并在程序退出时注册一个atexit
处理程序来恢复设置,然后禁用标准输入终端的回显。然后它进入一个无限的while循环。现在,当您在终端上键入任何内容时,什么 都不会显示,甚至 ^C
也不会显示。
shell 使用的技巧是它们完全取代 终端上的输入处理,关闭规范输入处理,一次读取标准输入一个字符,并处理它们的回显自己的 - 需要比 Stack Overflow 答案中可能的代码多得多的代码。
#include <termios.h>
#include <unistd.h>
#include <stdlib.h>
struct termios saved;
void restore(void) {
tcsetattr(STDIN_FILENO, TCSANOW, &saved);
}
int main() {
struct termios attributes;
tcgetattr(STDIN_FILENO, &saved);
atexit(restore);
tcgetattr(STDIN_FILENO, &attributes);
attributes.c_lflag &= ~ ECHO;
tcsetattr(STDIN_FILENO, TCSAFLUSH, &attributes);
printf("Entering the loop\n");
while(1) {};
}
关于c - 隐藏 ^C 在 C 中按 ctrl-c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42563400/