2017-04-21 4 views
0

出力をファイルにリダイレクトする必要のあるシェルに関数を書きます。たとえば、ユーザー書き込み:ls -l >> filels -lをファイルに書き込む必要があります。ほとんどすべてのことが正しいですが、最初に私の関数プログラムを停止した後、私は何も書き込めません。私は私の機能を提示し、私は問題を解決するために、任意の手掛かりをいただければ幸いです下:dup2の後にカスタムシェルが動作しなくなる

void execute2(char *command, char **argv, char **argv2) 
{ 
    pid_t pid; 
    int status; 

    if ((pid = fork()) < 0) 
    {  
     printf("*** ERROR ***\n"); 
      exit(1); 
    } 
    else if (pid == 0) 
    {  
     close(1);  
     parse(command, argv, argv2); 
     int output = open(*argv2, O_APPEND | O_WRONLY); 
     dup2(output,1);  
     if (strcmp(argv[0], "exit") == 0) 
      exit(0);  
     if (execvp(*argv, argv) < 0) 
     {  
      printf("*** ERROR ***\n"); 
      exit(1); 
     } 
     close(output); 
    } 
    else 
    {         
     while (wait(&status) != pid); 
    } 
} 

commandは、ユーザから取得コマンドがargvは、命令とパラメータとargv2出力ファイルがあるの一部である、です。

+1

'dup2(出力、1)の後と' execvp() 'の前、' strcmp() 'の前に' close(出力) 'してください。 'execvp()'からの戻り値をテストする必要はありません。それが失敗した場合にだけ返します。 –

+1

何とか子供が死ぬことを忘れてしまったら、あなたの待機ループは永遠に回転します。デバッグの場合は、プロセスIDとステータスをキャプチャして出力します。堅牢性のために。 'int corpse;を使う。 intステータス。 ( "状態(%)"は状態0x.4Xで終了しました\ n "、死体、状態);これは完璧ではありません。 'errno == EINTR'でシグナルが処理され、' wait() 'が' -1'を返す可能性は無視されます。少なくともこのように、あなたは何が起こっているのか知っているでしょう。 –

+0

あなたはどのようなコマンドをしていますか? 'ls'を起動している場合は、これが返されなければなりません。 stdinからの読み込みを阻止しようとしている 'cat'やその他のものを呼び出すのであれば、シグナルを送信するまで実行すると思います。 –

答えて

-2

@Jonathan Lefflerこれを確認したところ、問題は解決していないと思います。私は、私が最初にexecute2を呼び出すと、それは私が望むだけでなく動作することを提案しますが、私はそのプロッセスを終了しません。または、私はundestand何かを持っていません。

+0

これは質問への答えを提供しません。 [類似の質問を探す](http://stackoverflow.com/search)、またはページの右側にある関連するリンクされた質問を参照して回答を見つけることができます。関連しているが異なる質問がある場合は、[新しい質問をする](// stackoverflow.com/questions/ask)、コンテキストの提供に役立つこのリンクを追加してください。参照:[質問する、回答を得る、気を散らす](http://stackoverflow.com/tour) – Krease

関連する問題