2016-04-19 11 views
2

メッセージを出力するプログラムを作成し、ユーザーの入力を待ってメッセージを再度表示します。下の簡単な例はそれを示しています。このプログラムは、 'prog | tr 'a-z' 'A-Z'。最後の印刷だけが 'tr' a-z '' A-Z 'によって処理されるべきです。シェル作成パイプをリダイレクトする方法

int main() 
{ 
    char name[99]; 
    printf ("Your name: "); 
    scanf ("%98s", name); 
    printf ("Your name is: %s\n", name); 

    return 0; 
} 

私はpipe、dup、dup2でたくさん試しましたが、これまでのところ何もできませんでした。誰にも私の問題を解決するためのアイデアはありますか?さらにいくつかの研究の後

fprintf (stderr, "Your name: \n"); 

答えて

1

あなたは、このコマンドを使用してプログラムを起動したい場合は、あなたがやりたいための唯一の方法は、標準エラー出力にメッセージを表示することですもしそれに対処していなければ。

だからあなたは以下のように進めることができます:

#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <unistd.h> 

int print_to_terminal(const char *message) 
{ 
    FILE *termout; 

    if (isatty(STDOUT_FILENO)) 
    { 
     termout = stdout; 
    } 
    else 
    { 
     termout = fopen("/dev/tty", "w"); 
     if (termout == NULL) 
     { 
      perror("open"); 
      return EOF; 
     } 
    } 

    int result = fprintf(termout, "%s\n", message); 

    if (termout != stdout) 
    { 
     fclose(termout); 
    } 

    return result; 
} 

int main() 
{ 
    printf("Start of program.\n"); 
    print_to_terminal("Don't worry, be happy."); 
    printf("End of program.\n"); 

    return 0; 
} 

メッセージはstdoutとstderrの両方がファイルにリダイレクトされている場合でも、現在の端末で印刷されなければなりません。

+0

感謝。私はstderrについて考えましたが、私はstderrの誤用を避けることができると期待していました。 –

+0

@NickBendnerなぜ「リダイレクトするシェル作成パイプ」をしようとしていますか? – jdarthenay

+0

私のprogはユーザーの入力を要求する場合があります。それ以前には、なぜ入力が必要なのか、どのような入力が必要なのかというメッセージを出力します。ユーザーがパイプでprogを開始しない限り、すべてうまく動作します。ユーザーがそうした場合、stdoutはバッファされパイプにリダイレクトされるため、メッセージは出力されません。ユーザーはプロンプトしか表示されませんが、なぜ今何をするのかはわかりません。私の考えは、パイプを中断し、メッセージを印刷し、ユーザーの入力を取得し、パイプを再開することでした。 –

0

利用尾:あなたの答えのためのhttp://linux.die.net/man/1/tail

prog | tail -n 1 | tr 'a-z' 'A-Z' 
+0

あなたの答えをありがとうが、ユーザーは彼がprogをどのように起動するかを決めます。 tr 'a-z' 'A-Z'は、progがパイプで正常に動作しないことを示すための例です。 –

関連する問題