c - 隐藏 ^C 在 C 中按 ctrl-c

标签 c shell exit

我正在创建自己的 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/

相关文章:

c++ - 为什么 gdb "u"命令不退出循环?

java - Java 应用程序退出时刷新

c - 如何调试预处理器宏

c - *arr[] 是什么意思?

linux - $(pwd) - 上一级

linux - 有没有一种有效的方法来读取 bash 中的行输入?

linux - 如何在一个 linux 虚拟机上运行一个 shell 脚本,在另一个 linux 虚拟机上

c - 为什么 exit() 函数在 C "never fail"中?

c - 递归函数中的段错误

c - 通过恰好更改一个字符来修复损坏的循环