为啥 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 控制台?

将 nmap 输出发送到文件而不将其打印到标准输出

明明打印到文件了,为啥tail -f看不到

如何在不将其连接到终端的情况下运行“屏幕”,以便可以在 C++ (qt) 应用程序中捕获输出?

如何比较和打印具有相同输入的三个 exe 文件的输出?