public inbox for cygwin@cygwin.com
 help / color / mirror / Atom feed
From: Thomas Wolff <towo@towo.net>
To: cygwin@cygwin.com
Subject: Re: select() hanging after terminal killed
Date: Thu, 26 May 2011 22:44:00 -0000	[thread overview]
Message-ID: <4DDED7B0.4030106@towo.net> (raw)

[-- Attachment #1: Type: text/plain, Size: 1653 bytes --]

On 29.04.2010 17:21, Christopher Faylor wrote:
> On Thu, Apr 29, 2010 at 05:11:00PM +0200, Corinna Vinschen wrote:
>> On Apr 29 12:53, Thomas Wolff wrote:
>>> If a terminal gets killed, its tty/pty is not properly closed.
>>> This is likely to confuse applications and let them hang, as observed
>>> with mined (thanks Andy for the report) and joe.
>>>
>>> On Linux and SunOS, a subsequent read() return 0 (indicating EOF);
>>> any further read() returns -1, errno indicating EIO.
>>> Immediate write() may report success a few times,
>>> further write() returns -1, errno indicating EIO.
>>>
>>> On Linux, select() indicates an exception and EIO.
>>> On SunOS, select() indicates both an exception and input (weird),
>>> and ENOENT initially, EIO on further attempts.
>>>
>>> On Cygwin, the following is observed:
>>> * EOF is not signalled on read(); rather EIO is indicated right away.
>>>    (Maybe not too bad, an application can handle that as well.)
>>> * select() with timeout hangs.
>>>
>>> Especially the latter can hardly be handled by an application.
>> Can you create a simple testcase?
I finally managed it... (attached).
In a mintty or xterm, run hupsel > /dev/tty... (some other terminal to 
observe).
Then close the terminal (click on 'X' corner).
On Linux, the program terminates.
On cygwin, the program hangs in select().

> Hmm.  Since the owner has both sides of the pipe open maybe closing the
> slave side doesn't trigger select.
>
> It's possible that Corinna's changes to tty handling might make this
> work better.  It would be interesting to see how this works in a recent
> snapshot.
Unfortunately not.

Kind regards,
Thomas

[-- Attachment #2: hupsel.c --]
[-- Type: text/plain, Size: 1123 bytes --]

#include <stdio.h>
#include <stdlib.h>

#include <sys/select.h>
#include <errno.h>

#include <signal.h>

int
peek (int fd, int msec)
{
	fd_set readfds;
	fd_set exceptfds;
	struct timeval timeoutstru;

	FD_ZERO (& readfds);
	FD_SET (fd, & readfds);
	FD_ZERO (& exceptfds);
	FD_SET (fd, & exceptfds);
	timeoutstru.tv_sec = msec / 1000;
	timeoutstru.tv_usec = (msec % 1000) * 1000;

	errno = 0;
	printf ("calling select\n");
	int nfds = select (fd + 1, & readfds, 0, & exceptfds, & timeoutstru);
	printf ("select -> %d (%s), read %02X except %02X\n", 
		nfds, strerror (errno), readfds, exceptfds);

	return nfds;
}

void
catch_HUP (int hup)
{
	printf ("HUP\n");
	signal (SIGHUP, catch_HUP);
}

int
main ()
{
	int fdstdin = 0;

	system ("stty cbreak");
	signal (SIGHUP, catch_HUP);

	while (1) {
		char buf;
		int buflen = 1;

		int nfds = peek (fdstdin, 1500);
		if (nfds > 0) {
			printf ("calling read\n");
			errno = 0;
			int n = read (fdstdin, & buf, buflen);
			if (n <= 0) {
				printf ("read -> %d (%s); exit\n", n, strerror (errno));
				exit (0);
			}
			printf ("read -> %d: %c\n", n, buf);
		}
		sleep (2);
	}
}


[-- Attachment #3: Type: text/plain, Size: 218 bytes --]

--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple

             reply	other threads:[~2011-05-26 22:44 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-05-26 22:44 Thomas Wolff [this message]
  -- strict thread matches above, loose matches on Subject: below --
2010-04-29 11:28 Thomas Wolff
2010-04-29 12:17 ` Matthias Andree
2010-04-29 14:18   ` Thomas Wolff
2010-04-29 16:40     ` Matthias Andree
2010-04-29 15:19 ` Corinna Vinschen
2010-04-29 15:24   ` Christopher Faylor

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4DDED7B0.4030106@towo.net \
    --to=towo@towo.net \
    --cc=cygwin@cygwin.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).