LLDB ioctl 问题

LLDB ioctl problems

我有一个程序,我在其中使用 ioctl(0, TIOCGWINSZ, (struct winsize *)) 来查找终端的大小 window 该程序正在 运行ning 中。当我 运行 它在终端,它工作正常,但是当我使用 LLDB 时,ioctl 给出的 window 大小为 0 x 0.

示例:

#include <unistd.h>
#include <sys/ioctl.h>
#include <stdio.h>

int main(){
    struct winsize tty_window_size;

    ioctl(STDOUT_FILENO, TIOCGWINSZ, &tty_window_size);

    printf("Rows: %i, Cols: %i\n", tty_window_size.ws_row, tty_window_size.ws_col);

    return 0;
}

最终成绩单:

$ clang test.c
$ ./a.out
Rows: 24, Cols: 80
$ lldb ./a.out
(lldb) target create "./a.out"
Current executable set to './a.out' (x86_64).
(lldb) r
Process 32763 launched: './a.out' (x86_64)
Rows: 0, Cols: 0
Process 32763 exited with status = 0 (0x00000000)

有人知道为什么会发生这种情况,或者有解决方法吗?

提前致谢。

lldb 使用 pty 来处理程序输入和输出,但似乎是一个错误,因为它们没有设置为跟踪 lldb 的终端大小。请将其提交给 lldb.llvm.org 错误跟踪器。

如果你在 OS X 上,你可以 运行 在一个单独的终端 window 你的应用程序(如果你想用无论如何终端)通过像这样启动它:

(lldb) 进程启动-tty

我不知道这是否已在 Linux 上实施。

不确定它是否有用,因为它是旧的 post。无论如何......我遇到了同样的问题并找到了解决方法。如果 stdout 上的 ioctl 失败,则尝试 /dev/tty

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>

void getTerminalSize(int *row, int *col) {
  struct winsize ws;

  *row = *col = 0;      /* default value (indicates an error) */
  if (!isatty(STDOUT_FILENO)) {
    return;
  }

  ws.ws_row = ws.ws_col = 0;
  if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) == -1 || ws.ws_row == 0 || ws.ws_col == 0) {
    int fd = open("/dev/tty", O_RDONLY);
    if (fd != -1) {
      ioctl(fd, TIOCGWINSZ, &ws);
      close (fd);
    }
  }
  *row = ws.ws_row;
  *col = ws.ws_col;
}  

int main(){

  int row, col;
  getTerminalSize(&row, &col);
  printf("Row: %i, Col: %i\n", row, col);

  return 0;
}