[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