隐藏^ C在C中按ctrl-c

时间:2017-03-02 18:42:22

标签: 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)

2 个答案:

答案 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