我正在创建自己的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)
答案 0 :(得分:1)
^C
来自Linux中终端驱动程序的回显
这是C中的示例程序。它首先禁用保存当前设置,并注册atexit
处理程序以在程序退出时恢复设置,然后禁用标准输入终端上的回显。然后它进入无限循环。现在,当您在终端上键入任何内容时,将显示 nothing ,甚至不会显示^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) {};
}
答案 1 :(得分:0)
运行stty -echoctl
应隐藏它。有关详细信息,请参阅man stty
。