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

标签 linux debugging terminal gdb

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

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

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

最佳答案

我对相关错误中给出的程序进行了一些修改,以将文件名存储在某处 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;
}

关于linux - 从伪 tty 中分离一个 linux 进程,但保持 tty 运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14258478/

相关文章:

c - 将函数放入 avr 中跳过字符

linux - 如何在PBS中获取最大节点数和ppn

java - 在 CentOS7 上安装 Ant、JDK 和 JRE,之后仍然无法启动 .bat 文件

linux - 创建 Linux Bash 脚本来复制文件并创建目录

linux - CPAN 在 ubuntu 上给出各种错误

javascript - 使用 Heron 公式计算面积 - JavaScript

c++ - x11 xGetImage 错误匹配错误

php - 调试器未附加 - Xdebug - Atom (php)

c# - 无法在异常助手中查看抛出的异常详细信息

linux - 如何将用于列出重复文件的区分大小写的脚本转换为不区分大小写?