【问题标题】:Sending output to tty is not producing expected results [duplicate]将输出发送到 tty 不会产生预期的结果 [重复]
【发布时间】:2013-04-16 05:04:43
【问题描述】:

我显然没有期待正确的结果。

$ man less

在另一个终端:

$ ps u 
# Find that pid of less is 45783
$ lsof -p 45783
COMMAND   PID USER   FD   TYPE             DEVICE  SIZE/OFF    NODE NAME
less    45783 lust  cwd    DIR                1,4       442      46 /usr/share/man
less    45783 lust  txt    REG                1,4    137712    9698 /usr/bin/less
less    45783 lust  txt    REG                1,4    600576    9397 /usr/lib/dyld
less    45783 lust  txt    REG                1,4 303120384 2911813 /private/var/db/dyld/dyld_shared_cache_x86_64
less    45783 lust    0   PIPE 0xffffff8025bf38c0     16384
less    45783 lust    1u   CHR               16,2   0t82970     763 /dev/ttys002
less    45783 lust    2u   CHR               16,2   0t82970     763 /dev/ttys002
less    45783 lust    3r   REG                1,4      4589  286688 /private/etc/man.conf
less    45783 lust    4r   CHR                2,0       0t0     306 /dev/tty
$ echo "q" > /dev/ttys002

此时,man less 正在运行的终端打印 q 和换行符,而不是退出联机帮助页的显示。

我怎样才能让它发送原始的“q”?管道不起作用,我得到“zsh:权限被拒绝:/dev/ttys002”。将echo 切换为cat 并输入也不起作用。

【问题讨论】:

  • 您似乎对将输出发送到 tty 不感兴趣,正如您的问题标题所说,而是将输入注入到 tty 中——这是完全不同的事情!
  • @Celada 发送程序的输出 作为终端会话的输入
  • 确实如此。正如我所说,这与将输出发送到终端非常不同!

标签: shell unix io terminal zsh


【解决方案1】:

也许您想要的是协同处理。 zsh 支持这些。

 coproc bc -l
 print -p 1 + 1
 read -p answer
 echo $answer
 2

这允许您通过write -p控制子进程的标准输入

试试这个:它只是一个示例代码,可以根据需要进行修改。它写入终端的输入队列,/dev/pty3 或其他。仅以 root 身份运行。用法:./puttty /dev/pty3

int main(int argc, char **argv)  
{                                                 
   int tty = open(argv[1], O_WRONLY|O_NONBLOCK);
   char ch[80]={0x0};
   char *p=NULL;
   while( fgets(ch, 80, stdin)!=NULL)  //Read keyboard input e.g., q<return>
   {
      for(p=ch; *p && *p!='\n'; p++)
         ioctl(tty, TIOCSTI, p);    // put each byte into /dev/pty3  input queue.                    
   }                       
   close(tty); // ctrl-Z  ends the program.                                      
   return 0;                                         
}       

【讨论】:

  • 有趣。我不知道 coprocs。然而,我需要控制的不仅仅是标准输入(如果我需要的只是发送到标准输入,我更愿意使用管道),而是要实际翻译寻呼程序使用的交互式 tty。看来,实现这一点的唯一合理方法是通过 PTY 生成寻呼程序。
  • 你想在一个进程的stdout、stdin、stderr之间插入到其他进程吗?换句话说,您是否要检查“进出”另一个 tty 的所有内容?
  • 是的,我想翻译其中的内容,并显示它通常的作用。它本质上需要一个伪终端 pty,所以我现在用 Perl IO::Pty::Easy 构建一个。
猜你喜欢
  • 2017-06-07
  • 1970-01-01
  • 2020-12-26
  • 2015-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多