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
next 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).