在术语中使用backcote打开时屏幕大小为NULL

时间:2016-01-18 16:59:45

标签: c unix terminal termcap

我用termcaps编写C程序,我需要通过执行以下命令返回一个值:

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

知道为什么吗?也许回复引用复制没有屏幕的环境?!

2 个答案:

答案 0 :(得分:1)

首先:您不检查ioctl的返回值,这意味着当它失败时,结果w结构未定义。
第二:使用反引号时,您将程序与终端断开连接,因此您的ioctl 失败。
第三:重新设计程序,使用标准错误而不是标准输出来编写结果。然后像这样运行:

tmpfile=`mktemp`
./program arg1 arg2 arg3 arg4 2> $tmpfile
more `cat $tmpfile`
rm $tmpfile

答案 1 :(得分:0)

我找到了解决方案!

首先,我可以使用termcaps函数获得大小,如

tgetnum("co"); //column
tgetnum("li"); //rows

然后,为了处理背板,我在/dev/tty打印所有内容!

问题解决!