为啥 execlp() 不将输出打印到终端?
Posted
技术标签:
【中文标题】为啥 execlp() 不将输出打印到终端?【英文标题】:Why isn't execlp() printing output to the terminal?为什么 execlp() 不将输出打印到终端? 【发布时间】:2016-04-13 18:32:26 【问题描述】:我正在尝试将子进程的输出链接到父进程的输入;父进程是使用子进程的输出来执行系统调用或命令。
我已查看以下主题的答案;但是,我并没有完全得到我想要的答案。
Pipe - C++ piping issue
Linux Pipes as Input and Output
我遇到的问题是父进程中的命令没有被打印到终端。
为什么没有将输出打印到终端?我已经在父进程和子进程中关闭了管道的末端。此外,父级的 std_out 没有被修改。
这是我的代码。
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <iostream>
using namespace std;
int main(int argc, const char * argv[])
enum RD, WR;
int fd[2];
pid_t pid;
if (pipe(fd) < 0)
perror("pipe error");
else if ((pid = fork()) < 0)
perror("fork error");
else if (pid == 0) //In child process
close(fd[RD]);
dup2(fd[WR], STDOUT_FILENO);
close(fd[WR]);
execlp("/bin/ps", "ps", "-A", NULL);
else //In parent process
close(fd[WR]);
dup2(fd[RD], STDIN_FILENO);
close(fd[RD]);
wait(NULL);
execlp("/bin/wc", "wc", "-l", NULL);
return 0;
【问题讨论】:
【参考方案1】:你不检查execlp
的失败。
您确定您的所有程序都在您认为的位置吗?如果我将"/bin/wc"
更改为"/usr/bin/wc"
,您的程序对我有用。
【讨论】:
这确实解决了打印到终端的问题;但是,现在它只打印“0”。您是否将当前运行的所有进程的数量作为输出? 是的,刚才我尝试它时它打印了243
。您是否正在检查两个 execlp
调用的失败?当我将"/bin/ps"
更改为"/foo/bin/ps"
时,我看到0
作为主程序的输出。
不,我不是。我该怎么做?
只需在第一个后面加上perror("Child execlp failed");
,在第二个后面加上perror("Parent execlp failed");
。以上是关于为啥 execlp() 不将输出打印到终端?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 StandardScaler 不将元数据附加到输出列?
为啥脚本语言不将 Unicode 输出到 Windows 控制台?