【发布时间】:2017-08-06 20:11:19
【问题描述】:
我正在尝试创建一个函数,该函数运行一个命令,然后将输出通过管道传输到第二个命令并运行它。我正在无限循环中运行该函数。问题是,该功能第一次工作,但之后没有显示任何内容。
例如,当我运行ls | wc -l 时,它第一次显示正确的结果,但之后运行时却没有输出。
这是我的函数(解析在另一个函数中处理):
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);
}
为什么该函数只在第一个循环中正常工作?之后有什么变化?
【问题讨论】: