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);
}
は、しかし、動作しません。このコードの一部は、代わりにファイルが作成されますが、それには何も書き込まず、また、画面に出力します。私は子供スレッドが何かに書き込むまでブロックする必要がありますか?
HA!今私はfstreamが突然突然破綻した理由を理解する必要があります。しかし、データは今バッファに保存されています。ありがとうございました。 – chustar