Linux
程序從 readline 退出後,來自標準輸入的文本不可見
我面臨一個問題,我的標準輸入中的文本在我的終端上不可見。我的程序執行以下操作
設置一個 SIGALRM 處理程序,當在一定時間後沒有使用者輸入時退出程序。
void sigalrm_handler(int arg) { exit(0); }
在主要功能中:
{ ... alarm(100); line = readline(line = readline(prompt);) ... }
但是,在我的程序退出後,我看不到我在終端上輸入的內容。但是命令工作正常。
執行
system("reset")
暫時解決了這個問題。但我需要一個更清潔的解決方案。我已經嘗試過int rl_reset_line_state ()
,int rl_reset_terminal (char *terminal_name)
但它們似乎不起作用。
現代 shell 傾向於在程序退出後恢復終端狀態;如您所見,較舊或功能較弱的外殼可能不會。在 APUE 和其他文本中看到的常用方法是使用 保存終端狀態的副本
tcgetattr
,然後在程序退出時恢復該狀態:#include <sys/time.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <termios.h> #include <unistd.h> #include <readline/readline.h> #include <readline/history.h> struct itimerval Alarm_Timer; struct termios Original_Termios; int Need_Reset; void sigalrm_handler(int arg) { if (Need_Reset) tcsetattr(STDIN_FILENO, TCSANOW, &Original_Termios); exit(0); } int main(void) { char *line; tcgetattr(STDIN_FILENO, &Original_Termios); Need_Reset = 1; signal(SIGALRM, sigalrm_handler); Alarm_Timer.it_value.tv_sec = 3; setitimer(ITIMER_REAL, &Alarm_Timer, NULL); line = readline("* "); if (Need_Reset) tcsetattr(STDIN_FILENO, TCSANOW, &Original_Termios); exit(0); }