2016-11-22 22 views
0

私は現在、ユーザーがtelnetを使用してリモートマシンのbashシェルにアクセスできるアプリケーションを作成しています。アプリケーションは、リモートマシン上で動作するTelnetサーバーです。私はそうのように生成されたbashのプロセスにtelnetのストリームからの出力をパイプしています:私はあなたが通常のシェルで行うことができますほとんどすべてを行うことができる午前stdinからSIGINTを送信

char *execArgs[] = {"/bin/bash", "-i", 0}; 
execv(execArgs[0], execArgs); 

。 CTRL + Cでタスクを強制終了する際に問題が発生しています。私がtelnetの終わりからCTRL + Cシーケンスを受け取ると、それは[0xFF] [0xF8]として来ます。 FFは、(それがコマンドを解釈することができます)IACモードにTelnetを入れ、F8は(0×03)ETXを送信するために私のプログラムに指示します:outfdはbashのプロセスに流れている

char tmpchar = 3; 
retval = write(outfd[1], &tmpchar, 1); 
fflush(fstdin); 

。しかし、私は0x03がSIGINTシグナルとして解釈されているとは思っていません。少なくとも、現在実行中のタスクを殺しているわけではありません。これはなぜでしょうか?

+0

'^ C 'ではなく、' SIGINT'を送るべきです!あなたは 'bash'やパイプに話すためにptyを使っていますか? –

+0

私はパイプを使用しています – crocboy

答えて

2

端末がないため、端末機能は期待できません。したがって、^Cをパイプの下に送ると、^Cがパイプから出てきます。 killを使用してSIGINTをプロセスに送信することができます。

でも、端末を使ってbashと話すほうがずっと良いでしょう。シェルは、パイプではなく、ターミナルと対話することを期待しています。 man ptyをあなたのシステムにパンチし、それを正しく行う方法の学習を始めてください。 pty(7) manページから

(時には「PTY」と略記)疑似端末は、双方向通信チャネルを提供する仮想キャラクタデバイスのペアです。チャネルの一端はマスターと呼ばれます。もう一方の端はスレーブと呼ばれます。 擬似端末のスレーブ側は、古典的な端末とまったく同じように動作するインタフェースを提供します。 端末に接続されることを想定しているプロセスは、擬似端末のスレーブ側をオープンしてから、 をマスタ側をオープンしたプログラムによって駆動することができます。

マスタ側に書き込まれたものは、端末に入力されたかのように、スレーブ側のプロセス に提供されます。たとえば、割り込み 文字(通常はcontrol-C)をマスタデバイスに書き込むと、スレーブに接続されているフォアグラウンドプロセスグループ に対して割り込み信号(SIGINT)が生成されます。逆に、擬似端末の末尾にあるスレーブに書き込まれたものは、マスタ側に接続されているプロセスで読み取ることができます。疑似端末は、ネットワークログインサービス(ssh(1)、rlogin(1)、telnet(1))、端末エミュレータ、 スクリプト(1)、画面(1)、および期待(1)などのアプリケーションによって使用される です。

これはあなたの望みです。

+0

すばらしい答え、ありがとう! – crocboy

関連する問題