2011-11-12 12 views
2

execvpで起動された1つのプロセスとその親プロセスの間にパイプを設定しようとしています。 今、私のようなフォーク/配管/ DUP/EXEC:その後、Unixパイプが私のread()コマンドを待ちません

pid_t child = 0; 
int fds[2]; 
... 
void fork_exec(string cmd) { 
    pipe(fds); 
    child = fork(); 
    if(child == 0) { 
     close(fds[1]); 
     char *input = (char*)cmd.c_str(); 
     char *cmdArg[100]; 
     char *token = strtok(input, " \n"); 
     int i = 0; 
     cmdArg[i] = token; 
     //while this is not the last token 
     while(token != NULL) { 
      token = strtok(NULL, " \n"); 
      cmdArg[++i] = token; 
     } 
     cmdArg[++i] = NULL; 
     close(fds[0]); 
     dup2(1, fds[1]); 
     execvp(cmdArg[0], cmdArg); 
    } else { 
     close(fds[1]); 
    } 
} 

そして、プログラムの別の部分では、関数が戻るときには、いくつかの時間後に別の関数(親thead要素の一部として実行されています)は、パイプされた値をファイルに書き込もうとします。

void out(string name) { 
    ofstream fout; 
    fout.open((*cmdIter).c_str(), ofstream::app); 
    long lSize = 1000; 
    char * buffer; 
    buffer = new char[lSize]; 
    close(fds[1]); 
    read(fds[0], buffer, lSize); 
    fclose (pFile); 
    fout.write(buffer, lSize); 
    fout.close(); 
    delete [] buffer; 
    waitpid(child, &res, 0); 
} 

は、しかし、動作しません。このコードの一部は、代わりにファイルが作成されますが、それには何も書き込まず、また、画面に出力します。私は子供スレッドが何かに書き込むまでブロックする必要がありますか?

答えて

2

私は間違いはここにあると信じて:dup2(2)から

dup2(1, fds[1]); 

int dup2(int oldfd, int newfd); 
... 

    dup2() makes newfd be the copy of oldfd, closing newfd first 
    if necessary, but note the following: 

だから、あなただけのファイル記述子が数行上記pipe(2)から返さ閉じました。次の2つを交換してください:

dup2(fds[1], 1); 
+0

HA!今私はfstreamが突然突然破綻した理由を理解する必要があります。しかし、データは今バッファに保存されています。ありがとうございました。 – chustar