2016-12-01 4 views
1

私のプログラムに少し問題がありますが、解決方法はわかりません。 getopt(引数なし)を含まない限り、私のプログラムは正常に動作します。 stdout/stdinとパラメータ

は私がサーバー&クライアント

Serverはstdoutに数字を書き込み、クライアントがstdinでそれらを読んでください2つの、簡単なプログラムを書きました。

さらに、プログラムは引数(パラメータ)で呼び出すことができるはずです。プログラムの呼び出しのようになります例えば

:私は、プログラムを実行すると

Terminal: ./Server -f72 | ./Client -r22 

それだけで印刷し、引数「22」と「彼女をr」と「サーバーを待っています"しかし、それはサーバーから番号を印刷する必要があります

私は間違いを見つけることができません。私は本当にあなたの助けに感謝します。それを読んだすべての人に事前に感謝します。

サーバー:

int main(int argc , char *argv[]) 
{ 
    int i; 
    FILE *ziel; 
    ziel=stdout; 

    int option; 
    char buf[50]; 

    while ((option = getopt(argc, argv,"f:tr:d:j")) != -1) 
    { 
     switch (option) 
     { 
      case 'f' : 
       strcpy(buf,optarg); 
       break; 
      case 't' :    
       break; 
      case 'r' : 
       strcpy(buf,optarg); 
       break; 
      default: 
       //printf("1ERROR"); 
       exit(EXIT_FAILURE); 
     } 
    } 

    for(i=1;i>0;i++) 
    { 
     fprintf(ziel,"%d\n",i); 
     sleep(1); 
    } 
    return 0; 
} 

クライアント:

int main(int argc , char *argv[]) 
{ 
    FILE* cl; 
    cl=stdin; 
    int i; 
    int zahl[10]; 
    int option; 
    char buf[50]; 

    while ((option = getopt(argc, argv,"f:tr:")) != -1) 
    { 
     switch (option) 
     { 
      case 'f' : 
       puts("Here is f"); 
       strcpy(buf,optarg); 
       puts(buf); 
       break; 
      case 't' : 
       puts("Here is t"); 
       break; 
      case 'r' : 
       puts("Here is r"); 
       strcpy(buf,optarg); 
       puts(buf); 
       break; 
      default: 
       printf("ERROR"); 
       exit(EXIT_FAILURE); 
     } 
    } 

    puts("Waiting for Server"); 
    for(i=0;i<10;i++) 
    { 
     fscanf(cl,"%d",&zahl[i]); 
     printf("Received %d\n ",zahl[i]); 

    } 

    return 0; 
} 
+0

) './Server -f72'を実行すると数字が正しく表示されますか? –

+0

はい。私は別のプログラムでも、パラメータが重要であり、パイプでは引数の文字列を出力するプログラムを使用しています。 – Mossi

+0

これは上の例で動作しますか?その場合、それは[mcve]ではありません。他のプログラムが 'stdout'ではなく' stderr'を使用していると確信していますか?実際のケースとコンソールの出力をポストする必要があります。あなたは 'getopt'が犯人であることを本当に確信していますか?私はそれを真剣に疑うからです。 –

答えて

1

あなたの例では、問題がgetoptとは何の関係もありません。約の出力バッファリングです。

長時間待っていると、一度に多数の数字が表示されます。

私はそれが端末で印刷する場合改行、出力がフラッシュされるときfprintf

  • sleep(1)

  • 又はfflush(stdout);を使用して除去サーバプログラム

    • を変更することによって動作製それがなぜ機能するのか説明します。

    • リダイレクト出力で印刷する場合、バッファリングが行われます。あなたは明示的にバッファをフラッシュしなければなりません(Cライブラリはフラッシュすることができますが、ここでは起こっていません)。

    クライアントから制御することはできません。あなたのケースではサーバをmoreに配管しても動作しません。また、ここで

    読む:Does reading from stdin flush stdout?

    注:あなたはそれがttyに書いています信じるようにサーバープログラムをだますことができ、それは少しハックですが、仕事ができる:

    Pretend to be a tty in bash for any command

    (I現在、ドン

  • +0

    ありがとう!私はそれについて考えなかった。睡眠はちょうど私が送信したい値を計算する必要がある時間をシミュレートしましたが、それは今働きます – Mossi

    関連する問題