首页 文章

从伪tty中分离linux进程,但保持tty运行?

提问于
浏览
1

我想用2个xterm窗口调试一个控制台linux应用程序:一个用于gdb的窗口和另一个用于应用程序的窗口(例如mc) .

我现在做的是在第二个xterm窗口中运行'tty && sleep 1024d'(这给了我伪的tty名称),然后在gdb中运行'tty'将程序重定向到另一个xterm窗口 . 然而,GDB警告它不能设置控制终端并且某些次要功能不起作用(例如,处理窗口大小调整),因为'sleep 1024d'仍在该xterm窗口上运行 .

有没有更好的方法(而不是从shell启动进程并从gdb附加到它)?

1 回答

  • 2

    我有点修改了相关bug中给出的程序来存储文件名http://sourceware.org/bugzilla/show_bug.cgi?id=11403

    这是一个使用它的例子:

    $ xterm -e'./disowntty~ / tty.tmp'&sleep 1 && gdb --tty $(cat~ / tty.tmp)/ usr / bin / links

    /* tty;exec disowntty  */
    #include <sys/ioctl.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <limits.h>
    #include <stdlib.h>
    #include <signal.h>
    static void
    end (const char *msg)
    {
      perror (msg);
      for (;;)
        pause ();
    }
    int
    main (int argc, const char *argv[])
    {
      FILE *tty_name_file;
      const char *tty_filename;
    
      if (argc <= 1)
        return 1;
      else
        tty_filename = argv[1];
    
      void (*orig) (int signo);
      setbuf (stdout, NULL);
      orig = signal (SIGHUP, SIG_IGN);
      if (orig != SIG_DFL)
        end ("signal (SIGHUP)");
      /* Verify we are the sole owner of the tty.  */
      if (ioctl (STDIN_FILENO, TIOCSCTTY, 0) != 0)
        end ("TIOCSCTTY");
      printf("%s %s\n", tty_filename, ttyname(STDIN_FILENO));
      tty_name_file = fopen(tty_filename, "w");
      fprintf(tty_name_file, "%s\n", ttyname(STDIN_FILENO));
      fclose(tty_name_file);
    
      /* Disown the tty.  */
      if (ioctl (STDIN_FILENO, TIOCNOTTY) != 0)
        end ("TIOCNOTTY");
      end ("OK, disowned");
    
      return 1;
    }
    

相关问题