我有一个程序,我在其中使用ioctl(0, TIOCGWINSZ, (struct winsize *))来查找运行该程序的终端窗口的大小。当我在终端中运行它时,它工作得很好,但当我使用LLDB时,ioctl给出的窗口大小为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)有没有人知道为什么会发生这种情况,或者有办法解决这个问题?
提前谢谢。
发布于 2021-06-15 01:53:27
不确定它是否有用,因为它是一个旧帖子。不管怎样..。我遇到了同样的问题,并找到了解决方法。如果标准输出上的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;
}发布于 2016-09-01 08:18:28
lldb使用pty来处理程序的输入和输出,但它们没有被设置为跟踪lldb的终端大小,这似乎是一个错误。请将其提交到lldb.llvm.org错误跟踪器。
如果你在OS上,你可以在一个单独的终端窗口中运行你的应用程序(如果你想在终端上做任何花哨的事情,这可能就是你想要的),启动它,如下所示:
(lldb)进程启动-tty
我不知道这是否已经在Linux上实现了。
https://stackoverflow.com/questions/39260719
复制相似问题