4
回答
《linux程序设计》中一个例题的疑问
终于搞明白,存储TCO原来是这样算的>>>   

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <termios.h>
#include <term.h>
#include <curses.h>

static FILE *output_stream = (FILE *)0;

char *menu[] = {
  "a - add new record",
  "d - delete record",
  "q - quit",
  NULL};

int getchoice(char *grreet, char *choices[], FILE *in, FILE *out);
int char_to_terminal(int char_to_write);

int main()
{
  char choice = 0;
  FILE *input;
  FILE *output;
  struct termios initial_settings, new_settings;

  if(!isatty(fileno(stdout)))
     {
	fprintf(stderr, "You are not a terminal, OK.\n"); 	
     }

  input = fopen("/dev/tty", "r");
  output = fopen("/dev/tty", "w");
  if(!input || !output)
    {
      fprintf(stderr, "Unable to open /dev/tty\n");
      exit(1);
    }

  tcgetattr(fileno(input), &initial_settings);
  new_settings = initial_settings;
  new_settings.c_lflag &= ~ICANON;
  new_settings.c_lflag &= ~ECHO;
  new_settings.c_cc[VMIN] = 1;
  new_settings.c_cc[VTIME] = 0;
  new_settings.c_lflag &= ~ISIG;
  if(tcsetattr(fileno(input), TCSANOW, &new_settings))
     fprintf(stderr, "Could not set attributes\n");

  do
    {
      choice = getchoice("Please select an action", menu, input, output);
      fprintf(output, "You have chosen: %c\n", choice);
      sleep(1);
    }while(choice != 'q');

  tcsetattr(fileno(input), TCSANOW, &initial_settings);
  exit(0);
}

int getchoice(char *greet, char *choices[], FILE *in, FILE *out)
{
  int chosen = 0;
  char selected;
  int screenrow, screencol = 10;
  char **option;
  char *cursor, *clear;

  output_stream = out;

  setupterm(NULL, fileno(out), (int *)0);
  cursor = tigetstr("cup");
  clear = tigetstr("clear");

  screenrow = 4;
  tputs(clear, 1, char_to_terminal);
  tputs(tparm(cursor, screenrow, screencol), 1, char_to_terminal);
  fprintf(out, "Choice:%s", greet);
  screenrow += 2;
  option = choices;
  while(*option)
    {
      tputs(tparm(cursor, screenrow, screencol), 1, char_to_terminal);
      fprintf(out, "%s", *option);
      screenrow++;
      option++;
    }
  fprintf(out, "\n请输入:");

  do
    {
      fflush(out);
      selected = fgetc(in);
      option = choices;
      while(*option)
	{
	  if(selected == *option[0])
	    {
	      chosen = 1;
	      break;
	    }
	  option++;
	}

      if(!chosen)
	{
	  tputs(tparm(cursor, screenrow, screencol), 1, char_to_terminal);
	  fprintf(out, "Incorrect choice, select again\n");
	}
    }while(!chosen);
  tputs(clear, 1, char_to_terminal);
  return selected;
}

int char_to_terminal(int char_to_write)
{
  if (output_stream)
    putc(char_to_write, output_stream);
  return 0;
}
如果在main函数中的

do
    {
      choice = getchoice("Please select an action", menu, input, output);
      fprintf(output, "You have chosen: %c\n", choice);
      sleep(1);
    }while(choice != 'q');

循环中不加入sleep(1); 这条语句

那么在程序键入a或d(键入q正常),程序判断出错,且对环境的这两条  
new_settings.c_cc[VMIN] = 1;

  new_settings.c_cc[VTIME] = 0;语句没有起效,还是需要输入回车,还有,在gdb调试中,运行也是正常的。表达能力不好,敬请谅解。谢谢各位了。

环境:ubuntu+gcc

举报
走过海
发帖于5年前 4回/395阅
顶部