【问题标题】:screen size NULL when opening with backcote in term使用 backcote 打开时屏幕大小为 NULL
【发布时间】:2016-04-23 22:38:52
【问题描述】:

我正在用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

知道为什么吗?也许反引号复制了一个没有屏幕的环境?!

【问题讨论】:

  • 当您尝试打印 w.ws_row 和 w.ws_col 的值时会发生什么?如果它们不是您所期望的,那么问题可能在于 ioctl() 函数或在这种情况下您如何使用它
  • 我编辑了,它逐行打印我的单词。

标签: c unix terminal termcap


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我找到了解决办法!

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

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

    然后,为了处理 backcote,我将在 /dev/tty 上打印所有内容!

    问题解决!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-05
      • 2011-06-07
      • 1970-01-01
      • 2013-07-25
      • 1970-01-01
      相关资源
      最近更新 更多