Linux

程序從 readline 退出後,來自標準輸入的文本不可見

  • April 10, 2019

我面臨一個問題,我的標準輸入中的文本在我的終端上不可見。我的程序執行以下操作

設置一個 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);
}

引用自:https://unix.stackexchange.com/questions/497859