Mirror of the gdb mailing list
 help / color / mirror / Atom feed
From: Marco Zandonadi <marco_zandonadi@yahoo.com>
To: gdb@sources.redhat.com
Subject: Driving gdb from a front end: how to send ctrl-c?
Date: Thu, 18 Mar 2004 04:02:00 -0000	[thread overview]
Message-ID: <20040318040247.91931.qmail@web14104.mail.yahoo.com> (raw)

Hello,
I'm writing a front end for gdb that needs to work on
Cygwin and Linux. I'm trying out Cygwin first. After
reading several posts in the archives of this ML I
came up with a small proof-of-concept program that:
- sets up master and slave PTY
- forks a process and executes gdb in it
- sends a few commands to gdb

Everything works ok except ctrl-c. Here is the
sequence of commands my program is sending gdb:
- b main
- r
- c 
- ctrl-c (ASCII char 3)

I can see the proper output for all commands except
ctrl-c. I guess this is because I missed some terminal
settings.

The other problem is that I get about 10 msgs like
this:
[tcsetpgrp failed in terminal_inferior: Operation not
permitted]

I attached the small cygwin program I talked about.
Any help will be very much appreciated.

Marco



#include <stdio.h>
#include <stdlib.h>
#include <sys/file.h>
#include <sys/ioctl.h>
#include <sys/uio.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/syslimits.h>
#include <sys/wait.h>
#include <unistd.h>
#include <pty.h>
#include <termios.h>

#define MAX_BUF_SIZE 2048

int
main (int argc, char *argv[])
{
  pid_t pid;
  size_t c;
  fd_set readfds;
  int master, slave, i;
  struct termios tt;
  struct termios rtt;

  char buf[MAX_BUF_SIZE];
  char *execargs[3] = {"/bin/gdb.exe", "./test.exe",
0};
  char ctrl_c[2] = {3, '\n'};
  struct timeval tv = {5, 000000};

  master = open ("/dev/ptmx", O_RDWR);
  if (master < 0) {
    perror ("Couldn't open master");
    exit( 1 );
  }
  (void) tcgetattr(0, &tt);
  grantpt(master);
  unlockpt(master);
  slave = open (ptsname(master), O_RDWR | O_NOCTTY);  

  if (slave < 0) {
    perror("Couldn't open slave");
    exit (1);
  }
  rtt = tt;
  rtt.c_iflag |= BRKINT;
  rtt.c_lflag |= ISIG;
  rtt.c_cflag |= CS8;
  
  (void) tcsetattr(0, TCSAFLUSH, &rtt);

  i = fork ();
  if (i < 0) {
    perror ("Couldn't fork");
    exit (1);
  }
  if (i == 0) {
    printf( "Entering child...\n" );
    if (close (master) < 0) {
      perror( "Couldn't close master");
      exit (1);
    }

    for (i = 0; i < 3; i++) {
      if (close (i) < 0) {
        perror ("close in child");
        exit (1);
      }
    }

    for (i = 0; i < 3; i++) {
      if (dup2 (slave, i) < 0) {
        perror ("dup2 in child");
        exit (1);
      }
    }

    (void) tcsetattr(slave, TCSAFLUSH, &tt);

    if (setsid () == -1) {
      perror ("setsid()");
      exit (1);
    }

    close (slave);

    if (execvp ("/bin/gdb.exe", execargs) < 0) {
      perror (execargs[0]);
      exit (1);
    }

    _exit( -43 );

  }

  printf ("In parent.\n");
  close (slave);
  FD_ZERO (&readfds);

  write (master, "b main\n", 7);
  write (master, "r\n", 2);
  write (master, "c\n", 2);
  select (master + 1, NULL, NULL, NULL, &tv);
  write (master, ctrl_c, 2);

  while (1) {
    c = read( master, buf, MAX_BUF_SIZE );
    write (1, buf, c);
  }

  pid = wait( NULL );
  printf( "child with pid %d finished.\n", pid );

  exit( 0 );
}


__________________________________
Do you Yahoo!?
Yahoo! Mail - More reliable, more storage, less spam
http://mail.yahoo.com


             reply	other threads:[~2004-03-18  4:02 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-03-18  4:02 Marco Zandonadi [this message]
2004-03-18  4:13 ` Bob Rossi

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=20040318040247.91931.qmail@web14104.mail.yahoo.com \
    --to=marco_zandonadi@yahoo.com \
    --cc=gdb@sources.redhat.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