我正在创建自己的shell,我想在任何Linux发行版上的任何用户按下ctrl + c时禁用^C。
我不需要处理信号SIGINT,我已经在ctrl + c上做了不要停止程序。我只是想知道如何隐藏这两个字符^C。
在我的程序开始的时候,有没有什么函数需要调用或者env变量需要设置?
编辑
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)
3条答案
按热度按时间x6h2sr281#
^C
来自Linux中终端驱动程序上的echo这里有一个C语言的示例程序。它首先禁用保存当前设置,并注册一个
atexit
处理程序以在程序退出时恢复设置,然后禁用标准输入端的echo。然后它进入一个无限的while循环。现在,当您在终端上输入任何内容时,nothing 都不会显示,甚至^C
也不会显示。shell使用的技巧是它们 * 完全取代 * 终端上的输入处理,关闭规范输入处理,一次阅读一个字符的标准输入,并自己处理回显-这需要比Stack Overflow答案更多的代码。
nwsw7zdq2#
运行
stty -echoctl
应该会隐藏它。请参阅man stty
了解更多详细信息。sbdsn5lh3#
可以使用ANSI escape codes删除^C字符。在处理SIGINT信号的函数中,打印将光标向左移动两次的字符,然后删除右边直到行尾的所有字符。
下面的示例适用于macOS和Raspberry Pi OS。
在Windows上不需要这个技巧,因为按ctrl+c是无声的。