2
1つのコマンドを実行し、出力を2番目のコマンドにパイプして実行する関数を作成しようとしています。私は関数を無限ループで実行しています。問題は、関数が初めて動作するが、それ以降は何も表示されないということです。 たとえば、ls | wc -l
を実行すると、最初に正しい結果が表示されますが、その後に実行すると出力が表示されません。ここでforkとexecで配管した後で出力が表示されない
は(構文解析が別の関数内で処理されます)私の関数である。
void system_pipe(std::string command1, std::string command2)
{
int status;
int fd[2];
int fd2[2];
pipe(fd);
int pid = fork();
// Child process.
if (pid == 0)
{
std::shared_ptr<char> temp = string_to_char(command1);
char *name[] = {"/bin/bash", "-c", temp.get(), NULL};
close(fd[0]);
dup2(fd[1], 1);
execvp(name[0], name);
exit(EXIT_FAILURE);
}
// Parent process.
else
{
std::shared_ptr<char> temp = string_to_char(command2);
char *name[] = {"/bin/bash", "-c", temp.get(), NULL};
close(fd[1]);
dup2(fd[0], 0);
waitpid(pid, &status, 0);
//my_system(command2);
// Fork and exec a new process here.
int pid2 = fork();
if (pid2 == 0)
{
execvp(name[0], name);
exit(EXIT_FAILURE);
}
else
{
waitpid(pid2, NULL, 0);
}
}
if (status)
std::cout << "Bad" << std::endl;
}
私はこのような関数を呼び出す:
while(true)
{
string line;
getline(cin, line);
pair<string, string> commands = parse(line);
system_pipe(commands.first, commands.second);
}
機能のみ、最初のループ上で正常に動作しているのはなぜ?それ以降は何が変わりますか?