delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2007/04/03/10:43:06

X-Spam-Check-By: sourceware.org
Date: Tue, 3 Apr 2007 10:42:39 -0400
From: Bob Rossi <bob_rossi AT cox DOT net>
To: cygwin AT cygwin DOT com
Subject: Re: SIGTSTP and select
Message-ID: <20070403144239.GB3459@cox.net>
Mail-Followup-To: cygwin AT cygwin DOT com
References: <20070403000723 DOT GG24160 AT cox DOT net> <20070403003753 DOT GA11244 AT ednor DOT casa DOT cgf DOT cx> <20070403141320 DOT GA3459 AT cox DOT net>
MIME-Version: 1.0
In-Reply-To: <20070403141320.GA3459@cox.net>
User-Agent: Mutt/1.5.12-2006-07-14
Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm
List-Id: <cygwin.cygwin.com>
List-Unsubscribe: <mailto:cygwin-unsubscribe-archive-cygwin=delorie DOT com AT cygwin DOT com>
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sourceware.org/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sourceware.org/ml/#faqs>
Sender: cygwin-owner AT cygwin DOT com
Mail-Followup-To: cygwin AT cygwin DOT com
Delivered-To: mailing list cygwin AT cygwin DOT com

--3V7upXqbjpZ4EhLz
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

On Tue, Apr 03, 2007 at 10:13:20AM -0400, Bob Rossi wrote:
> On Mon, Apr 02, 2007 at 08:37:53PM -0400, Christopher Faylor wrote:
> > On Mon, Apr 02, 2007 at 08:07:23PM -0400, Bob Rossi wrote:
> > >I'm not exactly sure what has changed since the last release to cause
> > >this issue. However, here it is.
> > >
> > >When ctrl-z is typed, CGDB receives a SIGTSTP on both linux and cygwin.
> > >When CGDB is at the select loop and this happens on linux select returns
> > >-1 and errno is set to EINTR. My code simple does a 'continue' when this
> > >happens and the select loop is reentered. All works well. On cygwin,
> > >select does not return with -1. (I didn't check the return value but I
> > >can, I just compare to -1 in an if statement). In fact, select also
> > >detects that input is ready on stdin. This causes CGDB to get to a read
> > >system call (which is non blocking) and the read system call fails with
> > >errno set to EAGAIN. This causes CGDB to exit.
> > >
> > >The main loop looks something like this,
> > >  if (select (max + 1, &rset, NULL, NULL, NULL) == -1)
> > >    { 
> > >      if (errno == EINTR)
> > >        continue;
> > >      ..
> > >    }
> > >
> > >  if (FD_ISSET (STDIN_FILENO, &rset)) {
> > >    handle_stdin
> > >  }
> > >
> > >So, my question is, is there a bug with select on cygwin? Is select
> > >working properly and I should handle the read call differently? Why does
> > >it act differently than linux?
> > 
> > You say that something changed between different releases but you don't
> > mention what those releases are.  Is this releases of Cygwin?  If so,
> > what releases?
> > 
> > If this is as easy to demonstrate as you say, then a simple test case
> > is definitely called for.
> 
> Hi Christopher,
> 
> Attached is the test case. If I run it under linux, and then type ctrl-z, I 
> never get into the user_input_loop call. If I run it in cygwin, I do.
> 
> Hopefully I'm doing something wrong here. Please advise!

Ouch. Attached.

Bob Rossi

--3V7upXqbjpZ4EhLz
Content-Type: text/x-csrc; charset=us-ascii
Content-Disposition: attachment; filename="main.c"

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/select.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <termios.h>

static struct termios term_attributes;

int 
tty_cbreak (int fd, struct termios *orig)
{
  struct termios buf;
   
  if (tcgetattr (fd, &buf) < 0)
    return -1;

  /* Save the original state, for resetting later */
  *orig = buf;
      
  buf.c_lflag &= ~(ECHO | ICANON);
  buf.c_iflag &= ~(ICRNL | INLCR);
  buf.c_cc[VMIN] = 1;
  buf.c_cc[VTIME] = 0;

#if defined (VLNEXT) && defined (_POSIX_VDISABLE)
  buf.c_cc[VLNEXT] = _POSIX_VDISABLE;
#endif

#if defined (VDSUSP) && defined (_POSIX_VDISABLE)
  buf.c_cc[VDSUSP] = _POSIX_VDISABLE;
#endif

  if (tcsetattr (fd, TCSAFLUSH, &buf) < 0)
    return -1;

  return 0;   
}

int 
tty_set_attributes (int fd, struct termios *buf)
{
  if (tcsetattr (fd, TCSAFLUSH, buf) < 0)
    return -1;
      
  return 0;   
}

int
user_input_loop ()
{
   fprintf (stderr, "HERE\r\n");
   return 0;
}

static int
main_loop (void)
{
  fd_set rset;
  int max = STDIN_FILENO;

  for (;;)
  {
     /* Reset the fd_set, and watch for input from GDB or stdin */
     FD_ZERO (&rset);

     FD_SET (STDIN_FILENO, &rset);

     /* Wait for input */
     if (select (max + 1, &rset, NULL, NULL, NULL) == -1)
     {
        if (errno == EINTR)
           continue;
        else
        {
           fprintf (stderr, __FILE__, __LINE__,
                 "select failed: %s", strerror (errno));
           return -1;
        }
     }

     /* Input received:  Handle it */
     if (FD_ISSET (STDIN_FILENO, &rset)) {
        if (user_input_loop () == -1)
           return -1;
     }
  }

  return 0;
}

int
main (int argc, char *argv[])
{
  if (tty_cbreak (STDIN_FILENO, &term_attributes) == -1)
    {
      fprintf (stderr, __FILE__, __LINE__, "tty_cbreak error");
      exit (-1);
    }

  /* Enter main loop */
  main_loop ();

  if (tty_set_attributes (STDIN_FILENO, &term_attributes) == -1)
    fprintf (stderr, __FILE__, __LINE__, "tty_reset error");

  return 0;
}


--3V7upXqbjpZ4EhLz
Content-Type: text/plain; charset=us-ascii

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

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019