在术语中使用 backcote 打开时屏幕大小为 NULL
screen size NULL when opening with backcote in term
我正在用 termcaps
编写一个 C 程序,我需要通过执行 return 一个值:
more `./program arg1 arg2 arg3 arg4`
如果我的屏幕太小,我的函数 get_winsize
有一个条件。
int *get_winsize()
{
struct winsize w;
int *ret;
ret = malloc(sizeof(int) * 2);
ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
ret[0] = w.ws_row;
ret[1] = w.ws_col;
if (ret[0] <= 5 || ret[1] <= 5)
{
printf("screen too small : size %d x %d\n", ret[0], ret[1]);
exit(0);
}
return (ret);
}
当我在没有反引号的情况下启动我的程序时,我没有问题。
但是我有反引号:
size: No such file or directory
screen: No such file or directory
0: No such file or directory
x: No such file or directory
0: No such file or directory
知道为什么吗?也许反引号复制了一个没有屏幕的环境?!
首先:您没有检查 ioctl
的 return 值,这意味着当它失败时导致 w
结构未定义。
第二:当使用反引号时,您会断开程序与终端的连接,因此您的 ioctl 将 失败。
第三:重新设计你的程序,使用标准错误而不是标准输出来编写你的结果。然后 运行 像这样:
tmpfile=`mktemp`
./program arg1 arg2 arg3 arg4 2> $tmpfile
more `cat $tmpfile`
rm $tmpfile
我找到了解决方案!
首先,我可以使用 termcaps 函数获取大小,例如
tgetnum("co"); //column
tgetnum("li"); //rows
然后,为了处理 backcote,我将在 /dev/tty
上打印所有内容!
问题解决!
我正在用 termcaps
编写一个 C 程序,我需要通过执行 return 一个值:
more `./program arg1 arg2 arg3 arg4`
如果我的屏幕太小,我的函数 get_winsize
有一个条件。
int *get_winsize()
{
struct winsize w;
int *ret;
ret = malloc(sizeof(int) * 2);
ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
ret[0] = w.ws_row;
ret[1] = w.ws_col;
if (ret[0] <= 5 || ret[1] <= 5)
{
printf("screen too small : size %d x %d\n", ret[0], ret[1]);
exit(0);
}
return (ret);
}
当我在没有反引号的情况下启动我的程序时,我没有问题。 但是我有反引号:
size: No such file or directory
screen: No such file or directory
0: No such file or directory
x: No such file or directory
0: No such file or directory
知道为什么吗?也许反引号复制了一个没有屏幕的环境?!
首先:您没有检查 ioctl
的 return 值,这意味着当它失败时导致 w
结构未定义。
第二:当使用反引号时,您会断开程序与终端的连接,因此您的 ioctl 将 失败。
第三:重新设计你的程序,使用标准错误而不是标准输出来编写你的结果。然后 运行 像这样:
tmpfile=`mktemp`
./program arg1 arg2 arg3 arg4 2> $tmpfile
more `cat $tmpfile`
rm $tmpfile
我找到了解决方案!
首先,我可以使用 termcaps 函数获取大小,例如
tgetnum("co"); //column
tgetnum("li"); //rows
然后,为了处理 backcote,我将在 /dev/tty
上打印所有内容!
问题解决!