2013-04-16 68 views
0

我顯然不期望得到正確的結果。發送輸出到tty不會產生預期結果

$ 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:permission denied:/ dev/ttys002」。切換echocat並鍵入它也沒有工作。

+0

好像你不感興趣的輸出發送到一個tty你的問題的標題說,而是在注射輸入到tty - 一個非常不同的事情! – Celada

+0

@Celada將**程序的輸出作爲輸入發送到終端會話*? –

+0

確實。正如我所說,這與將輸出發送到終端非常不同! – Celada

回答

0

可能你想要的是一個coprocesses。 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;           
}  
+0

有趣。我不知道coprocs。不過,我需要控制的不僅僅是stdin(如果我需要發送給stdin,我更願意使用管道),而是實際轉換尋呼機程序使用的交互式tty。看來,實現這一目標的唯一合理方法是通過PTY產生尋呼機程序。 –

+0

你想在一個進程的stdout,stdin,stderr之間插入一些其他進程?換句話說,你是否想要檢查「去往和來自」另一個tty的所有內容? –

+0

是的,我想翻譯進去的內容,並展示它通常會做什麼。它基本上需要僞終端pty,所以我現在用Perl IO :: Pty :: Easy創建一個。 –

相關問題