管道输出到较小时的终端宽度IOCTL

时间:2016-03-10 13:29:17

标签: terminal less ioctl

我有这个使用

的程序
ioctl(file_descriptor_of_stdout, TIOCGWINSZ, &w);

获取终端宽度(用于打印数组)。如果我直接在终端上运行我的程序,这可以正常工作;但是,我经常通过较少的输出来进行分页和搜索。为了便于讨论,假设stderr也是管道输入,所以我不能欺骗"期待实际去终点站。

现在,较少自己 考虑到终端的宽度 - 用于断线或切断它们。它是否不以某种方式将这些信息进一步传达给通过它传播的任何信息?

1 个答案:

答案 0 :(得分:2)

您有多个选择:

  • 有三个流( stdin stdout stderr ),您的程序可以使用isatty(fileno(stdin))等进行检查。重定向交互式程序的输出通常比重定向输入更重要,因此值得检查。
  • 如果所有流都不是终端,则可以打开与每个交互式进程关联的tty。这不一定是/dev/tty,如在xterm中运行的shell的快速​​检查中所示:
    $ ls -l /dev/tty;tty;ls -l `tty`
    crw-rw-rw- 1 root root 5, 0 Mar 10 15:46 /dev/tty
    /dev/pts/1
    crw--w---- 1 tom tty 136, 1 Mar 10 16:09 /dev/pts/1
  • POSIX记录了tty程序,它似乎是一个很好的起点。但是,您的程序必须从管道读取路径名(比应用于标准流的isatty稍微复杂一点)。文档还说

      

    虽然没有从标准输入读取输入,但应检查标准输入以确定它是否是终端,如果是,则确定终端的名称。

    也就是说,如果您的程序的标准输入被重定向(不是终端),tty无助于找到真正的终端。
    @einpoklum的评论提醒我,POSIX还记录了库调用ttyname。顺便说一句,通常当一个程序是通过一个特定的函数调用实现的时候,POSIX会记录该程序,并表示如果它使用该调用它就像“好像”一样。但它没有提及tty

  • 如果没有标准流是终端,则可以尝试打开/dev/tty。如果您的程序不是交互式的,则可能会失败,例如,在cron或后台运行。为了避免看起来有点奇怪的批评,偶尔会要求从cron打开一个X应用程序。同样,POSIX文档(在10.1 Directory Structure and Files
  • 中)