【问题标题】:How to create a bidirectional channel between processes?如何在进程之间创建双向通道?
【发布时间】:2019-12-18 20:45:14
【问题描述】:

在我的项目中,我需要从 c++ 运行一个 php 脚本,将标准输入传递给它,然后选择标准输出。为此,我使用 fork() 创建子进程,使用 pipe() 打开管道,通过 dup2 重新分配 I/O 流,并使用 execlp() 运行脚本。我写了一个小程序进行测试,但是它不起作用,死机,等到子进程向通道写入一些东西,但是没有发生这种情况,我做错了什么?

cpp 代码

int main()
{
    pid_t pid;
    int pipe_in[2];
    int pipe_out[2];
    pipe(pipe_in);
    pipe(pipe_out);
    if ((pid = fork()) > 0)
    {
        close(pipe_in[0]);
        close(pipe_out[1]); и

        std::string msg = "hello world\n";
        char buf[256];
        write(pipe_in[1], msg.c_str(), msg.length());
        read(pipe_out[0], buf, 255);
        std::string temp = buf;
        std::cout « temp;
    }
    else
    {
        close(pipe_in[1]);
        close(pipe_out[0]);
        dup2(pipe_in[0], 0);
        dup2(pipe_out[1], 1);
        if(execlp("php", "/home/anton/test1.php", NULL) < 0)
        std::cout «"((("; 

    }
}

php代码

<?php
$line = trim(fgets(STDIN));
echo $line;
echo "11111";
?>

【问题讨论】:

    标签: php c++ posix


    【解决方案1】:

    看起来您的管道和 I/O 重定向是正确的。我认为您正在处理的问题是滥用execlp 电话。第一个参数应该是要执行的文件的路径。其余参数实际上将是您要执行的程序的argv。因此,如果您考虑一下,execlp 的第二个参数将是该执行程序中的argv[0](程序名称)。所以你可以这样做:

    execlp(
        "/usr/bin/php", // actual path to executable file
        "myphp", // argv[0]
        "/home/anton/test1.php", // argv[1]
        NULL // sentinel
    );
    

    我特意为第二个参数写了一个夸张的程序名称,这样你就明白了。另外,我不使用 php,所以我假设 php 可执行文件位于/usr/bin/php。您可以通过运行:command -v php 来验证这一点。希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 2015-09-27
      • 2013-12-31
      • 2013-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多