From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 18665 invoked by alias); 18 Mar 2004 04:02:49 -0000 Mailing-List: contact gdb-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-owner@sources.redhat.com Received: (qmail 18655 invoked from network); 18 Mar 2004 04:02:47 -0000 Received: from unknown (HELO web14104.mail.yahoo.com) (216.136.172.134) by sources.redhat.com with SMTP; 18 Mar 2004 04:02:47 -0000 Message-ID: <20040318040247.91931.qmail@web14104.mail.yahoo.com> Received: from [24.7.65.189] by web14104.mail.yahoo.com via HTTP; Wed, 17 Mar 2004 20:02:47 PST Date: Thu, 18 Mar 2004 04:02:00 -0000 From: Marco Zandonadi Subject: Driving gdb from a front end: how to send ctrl-c? To: gdb@sources.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-SW-Source: 2004-03/txt/msg00166.txt.bz2 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 #include #include #include #include #include #include #include #include #include #include #include #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