2012-04-04 4 views
0

ファイルを読み込んで処理し、結果を出力ファイルに入れるプログラムがあります。引数(入力ファイル)があると、出力ファイルを作成して内容を書き出します。execl子どもから離れることはありません

stdoutにwrite()コンテンツをリダイレクトするためにfork()を行っています。

char *program; 

program = malloc(80); 

sprintf(program, "./program < %s > %s", inputFile, outputFile); 
int st; 
switch (fork()) { 
    case -1: 
     error("fork error"); 
     case 0: 
      /* I close the stdout */ 
      close (1); 

      if ((fd = open(outputfile, O_WRONLY | O_CREAT , S_IWUSR | S_IRUSR | S_IRGRP)==-1)){ 

       error("error creating the file \n"); 
       exit(1); 
      } 

      execlp("./program", program, (char *)0); 

      error("Error executing program\n"); 
       default: 
      // parent process - waits for child's end and ends 
      wait(&st); 
      exit(0); 
    //***************** 

       } 

子供が<> stdinとstdoutをファイルが作成されると正しく作成されます。 しかし、子供は決して終わらず、私が父親を殺すと、出力ファイルは空になるので、コードは実行されませんでした。

何が起こっていますか? ありがとう!

+0

リダイレクション。 – Flexo

+0

ありがとう!両方のソリューションが機能しました。 – drules

答えて

1

execファミリの関数はリダイレクトを理解しません。

execlpという方法では、1つの引数をプログラムに渡します:./program < %s > %s。そうです、一つの議論です。もちろん、execlpはリダイレクトが何であるかを知らず、どちらもprogramではありません。

私はすべてのコードを置き換えます:私は `)(オープン`と `dup2の()`と `のexec()`ではなく、IOのために `<` and `>を`使用しようとすると、これを行うだろう

char *program = malloc(LEN); 

snprintf(program, LEN, "./program < %s > %s", inputFile, outputFile); 
system(program); 
+0

私はあなたの診断に同意しますが、私は提案されたソリューションでは販売されていません - dup2はこれを行うもっと遠くの方法のようです。 – Flexo

+0

@awoodlandなぜクリーナーですか?おそらくシェルにリダイレクトを残しておくのが最も簡単です。これはシェルの目的です。もちろん、それは効率的ではなく、ポータブルではありませんが、3行で構成されています。 – cnicutar

+0

シェルの中身が深いCの中身が汚れています。ファンキーなシェルでの非優雅な失敗を除けば(私はむしろ、奇妙な実行時の問題よりもコンパイル時にエラーが出るでしょう)、悪いことが起こりやすいです。たとえば、outputFileに 'somepath; rm -rf〜 'またはそれより悪い。 – Flexo

関連する問題