[linux] Vreemd gedrag van xterm in Cygwin

Daniel von Asmuth asmuth op bakunin.xs4all.nl
Wo Jun 30 18:07:29 CEST 2010


L.S.,

Ik probeer een 'eenvoudige' functie te schrijven die een programma moet
doen wachten, totdat de eindgebruiker op een toets drukt. Met MS VS 2005
heb ik iets gebakken als:

static int
any_key( void)
{
  HANDLE                handle;
  int                   mode            = 0;
  size_t                count           = 0;

  handle = CreateFile( "CONIN$", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ |
                        FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
                        FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING, NULL);

  /* put the console into raw mode */ 
  if( GetConsoleMode( handle, &mode) == FALSE)
    return win_error( FALSE, "GetConsoleMode");
  if( SetConsoleMode( handle, 0) == FALSE)
    return win_error( FALSE, "SetConsoleMode");

  printf( "\n [Hit any key to end program] ");
  fflush( stdout);

  /* if GetConsoleMode() failed, read an entire line */
  if( mode != 0)
    ReadConsole( handle, err_msg, 1, &count, NULL);
  else
    count = read( 0, err_msg, BUF_LEN);

  /* restore console input mode */
  if( SetConsoleMode( handle, mode) == FALSE)
    return win_error( FALSE, "SetConsoleMode");
  CloseHandle( handle);

  return printf( "\n");
};

Nu blijkt de 'console', soms 'dos box' genoemd, niet helemaal hetzelfde
te zijn als een pseudo-terminal onder POSIX. In een gewoon cmd.exe of
bash.exe venster werkt de bovenstaande code naar wens, maar niet als
ik bash.exe of cmd.exe onder xterm.exe start: in dat geval retourneert
GetConsoleMode() een 0 en zal bovenstaande workaround wachten totdat je
op <Enter> drukt. Tot mijn verrassing blijkt het programma ook te
stoppen als je op een toets drukt in het console venster van waaruit
de Cygwin sessie is gestart. 

In bovenstaande code is win_error() een creatie die ongeveer hetzelfde
moet doen als perror (3) en read() is stiekem een macro die _read() 
aanroept.

Ook irritant: bestandsnamen met een dubbele 'extensie' (suffix), 
in de trant van 'package-1.2.0.tar.gz', kunnen onder Windows zowel 
verplicht als verboden zijn.

Met zonnige groet,



Daniel von Asmuth
 
-- 
		All true information in this message is freely redistributable
		Any lies are strictly protected by copyright



More information about the Linux mailing list