如何在进程之间创建双向通道?



在我的项目中,我需要从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 worldn";
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";
?>

看起来您的管道和 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。希望这有帮助。

最新更新