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;
}
我有一个程序,我在其中使用 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;
}