From: Andy K. <and...@gm...> - 2011-02-22 17:10:05
|
2011/2/22 Mathias Fröhlich: > On Tuesday 22 February 2011, Andy Koppe wrote: >> Bash is an MSYS program, i.e. it's linked against the MSYS (née >> Cygwin) DLL. For such programs, everything works just as on Unix, i.e. >> they get working pseudo terminal (pty) devices, termios, readline, and >> all that stuff . MSYS vim and ssh also tend to be happier in rxvt or >> mintty than in the Windows console. > Ok, the magic happens somewhere in msys.dll - ok, so far. > > But technically, the communication channel between mintty and the console > application is still just a windows pipe which does not deliver direct > tcsetattr support on that pipe. True? Yes, but. Firstly, the DLL implements read() and write() on both sides of that pipe, so it could theoretically implement a protocol interleaving data and control information. That would make interoperability with non-MSYS programs even worse though, so it doesn't do that. Secondly, the DLL actually shares some memory between all MSYS processes, providing another communication channel. This is used for things like the mount table, the process table, and indeed the pseudo terminal devices including their termios flags. However, this isn't really relevant to your question either. > Sure, I can use the usual escape sequences to switch on an off echo for > example by '\e[...'. But I was not able to find something like that to turn > off input line editing in the terminal. > And whatever example I was watching, there was a tcsetattr call that I was > wondering how it communicates with minty over the plain windows pipe. > > So how does {msys,cygwin}.dll tell mintty about the executed tcsetattr call > using that windows pipe? The answer is: it doesn't. Line editing and the interpretation of all the other termios flags are implemented on the slave side of the pseudo terminal device. On Linux, that's done in the kernel; in MSYS, it's done in the DLL. Mintty never looks at any of that, apart from when it first creates the shell process, where it sets a few termios flags. After that, it just processes whatever comes in via read()s from the master side of the pty device, including any escape sequences. Remember it's emulating a terminal that would have been connected to the host via a plain ol' serial cable. Here's a good article explaining this stuff: http://www.linusakesson.net/programming/tty/index.php Andy |