используя sigint из ctrl-c - PullRequest
       20

используя sigint из ctrl-c

6 голосов
/ 17 ноября 2010

хорошо, поэтому я использую sighandler для интерпретации некоторого сигнала, для этой цели это ctrl-c, поэтому, когда набирается ctrl-c, будет предпринято какое-то действие, и все будет хорошо, но я действительно для этого нужно, чтобы ^ c не появлялось на входе / выходе

например, допустим, у меня есть этот код

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

void siginthandler(int param)
{
  printf("User pressed Ctrl+C\n");
  exit(1);
}

int main()
{
  signal(SIGINT, siginthandler);
  while(1);
  return 0;
}

вывод будет

^ Пользователь нажал Ctrl + C

как я мог получить это просто

Пользователь нажал Ctrl + C?

Ответы [ 3 ]

3 голосов
/ 17 ноября 2010

Вы можете добиться этого эффекта, используя вызов noecho () из библиотеки curses - но вы должны быть готовы принять (и / или использовать) обработку терминала curses тоже ...

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

#include <curses.h>

void siginthandler(int param)
{
  endwin();
  printf("User pressed Ctrl+C\n");
  exit(1);
}

int main()
{
  initscr();
      noecho();
  signal(SIGINT, siginthandler);
  while(1);
  return 0;
}
1 голос
/ 17 ноября 2010

Скорее всего, это не ваша программа.Скорее всего, это будут драйверы терминала, и в этом случае вам следует изучить stty с параметрами ctlecho или echoctl.

Вы можете использовать stty -a, чтобы получить все текущие настройки для вашего терминалаустройство.Для программного интерфейса с этими элементами, termios - это путь.

0 голосов
/ 17 ноября 2010

Как уже говорили другие, подобные вещи попадают под контроль вашего терминала и обычно выполняются с помощью библиотеки curses.Тем не менее, вот взлом, который, вероятно, поможет вам на вашем пути:

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

void siginthandler(int param) {
    printf("User pressed Ctrl+C\n");
    system("stty echo");
    exit(1);
}

int main() {
    system("stty -echo");
    signal(SIGINT, siginthandler);
    while(1);
    return 0;
}
...