2016-06-23 24 views
0

私はリダイレクトを自分で教えようとしています。パイプとexec()を使用して別のコンソールアプリケーションを制御する

ユーザーに整数を入力して他の整数を出力するシンプルなプログラムがあります。ユーザーが0を入力して終了するまで無期限に出力します。

私はそのプログラムのラッパーを作成しようとしていますが、将来は別のコンソールアプリケーション用のGUIラッパーかもしれません。 目的はそのプログラムと通信することです。

私の最初の考えは、パイプを使用してプロセスをフォークし、パイプをstdinと子プロセスのstdoutに設定し、次にコンソールアプリケーションをexec()した。

コンソールアプリケーションは実行されますが、通常どおり実行されるため、これまでのコードは正しく動作しません。コンソールでは出力が行きたくない場所に移動します。

main() 
{ 
    int master_to_slave[2]; 
    int slave_to_master[2]; 

    pipe(master_to_slave); 
    pipe(slave_to_master); 

    int pid; 

    if((pid=fork())==0){ 
    close(master_to_slave[1]); 
    close(slave_to_master[0]); 
    dup2(0, master_to_slave[0]); 
    dup2(1, slave_to_master[1]); 
    char *args[] = { NULL }; 
    execv("/home/ebach/Documents/HIWI/random.exe",args); 
    } 
    else if(pid<0){ 
    //ALARM ALARM 
    } 
    else{ 
    close(master_to_slave[0]); 
    close(slave_to_master[1]); 

    while(1){ 
     char buff[16]; 
     int rd = read(slave_to_master[0], &buff, sizeof(buff)); 
     if(rd > 0){ 
     buff[rd-1] = '\0'; 
     printf("Redirected: "); 
     for(int i = 0; i < rd; i++){ 
    printf("T%c", buff[i]); 
     } 
     printf("\n"); 
     } 
    } 
    wait(NULL); 
    } 
} 

これまでのところ、コンソールアプリケーションの出力をリダイレクトすることになっています。 (あなたが見ることができるように、それは単に「リダイレクト:」を追加する必要があります。

とにかく、私はあなたが表示される場合がありますように、Cで完全に堪能ではないよ、私が障害を見つけることができません

私は「接続」しました間違っパイプ?

私が出会ったforkpty()とexec()を使用して疑似端末の使用をした別の解決策は、私はそのルートを行くべき?

感謝を任意の助けを事前に!

答えて

2

dup2を後方に使用しました。man pageint dup2(int fildes, int fildes2);dup2の場合、filedes2filedesと同じ開いているファイルを参照します。

+0

をさらに、正しくデュープ後、標準ストリーム上にだまされたオリジナルのFD閉じなければならない。 –

+0

本当にありがとうございます、私の問題を解決します。 –

2

@hacatuさんがあなたの主な問題点を特定したようです。また、

  • 私は子供dup2()はパイプが標準ストリームの1つに終わるよと、それはその管端を閉じる必要があり、hacatuの回答にコメントとして。例えば、ターゲットプログラムのargvベクトルに直接execl()execlp()、またはexecle()マップに提示し、
dup2(slave_to_master[1], 1); 
    close(slave_to_master[1]); 
  • execv()またはexecvp()に提示引数ベクトル、および引数リスト。このように、実行されているプログラムの名前を付ける少なくとも1つの要素が存在するのが普通です。一部のプログラムはそれに依存しています。たとえば:
char *args[] = { "random.exe", NULL }; 
    execv("/home/ebach/Documents/HIWI/random.exe", args); 

あなたはしかし、もう少し便利なこの場合execl()を見つけるかもしれない:

execl("/home/ebach/Documents/HIWI/random.exe", "random.exe", NULL); 
+0

入力いただきありがとうございます。実際、どのエグゼクティブが私のために正しいかわかりませんでした。さて、私はもう一つの問題に苦しんでいます。親プロセスは何かを出力していないようです。そして、明らかに、それが到達していないので、フォールトはread関数ではありません(私が知る限り、私はprintf()関数をいくつか挿入してテストしています)。 –

関連する問題