Это терминал, который повторяет эту вещь. Вы должны сказать это, чтобы прекратить это делать. Моя справочная страница stty
говорит
* [-]ctlecho
echo control characters in hat notation (`^c')
работает strace stty ctlecho
показывает
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(0, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig icanon echo ...}) = 0
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
Таким образом, запуск ioctl с правильными параметрами может отключить этот контроль эха. Посмотрите на man termios
удобный интерфейс для тех. Их легко использовать
#include <termios.h>
#include <unistd.h>
#include <stdio.h>
void setup_term(void) {
struct termios t;
tcgetattr(0, &t);
t.c_lflag &= ~ECHOCTL;
tcsetattr(0, TCSANOW, &t);
}
int main() {
setup_term();
getchar();
}
В качестве альтернативы, вы можете рассмотреть возможность использования GNU readline
для чтения строки ввода. Насколько я знаю, у него есть варианты, чтобы терминал не делал подобные вещи.