0

私は明らかに正しい結果を期待していません。

$ 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」と表示されます。切り替えechocat入力しても機能しませんでした。

4

1 に答える 1

0

多分あなたが望むのはコプロセスです。zsh はそれらをサポートしています。

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

これにより、子プロセスの標準入力を次の方法で制御できますwrite -p

これを試してみてください: これは単なるサンプル コードです。必要に応じて変更してください。端末の入力キュー、/dev/pty3 などに書き込みます。ルートとしてのみ実行します。使用法: ./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;                                         
}       
于 2013-04-16T18:27:44.787 に答える