使用 fork() 和 exec() 从 C++ 执行 Python 代码
Using fork() and exec() to execute Python code from C++
我正在尝试从 C++ 使用 exec() 到 运行 Python,并使用管道在进程之间进行通信。我发现 C++ 进程在 Python 进程终止后继续等待 exec() 命令,这导致它无法执行该行下面的代码。
请检查我下面的代码(我已将问题最小化,因此删除了实际通信部分)
C++ 文件:
int main()
{
int pipe_cpp_to_py[2];
int pipe_py_to_cpp[2];
if (pipe(pipe_cpp_to_py) || pipe(pipe_py_to_cpp))
{
std::cout << "Couldn't open pipes" << std::endl;
exit(1);
}
pid_t pid = fork();
if (pid == 0)
{
std::cout<<"child started"<<std::endl;
char *intrepreter="python3";
char *pythonPath="./Pipetest.py";
char *pythonArgs[]={intrepreter,pythonPath,NULL};
std::cout<<"child before exec"<<std::endl;
execvp(intrepreter,pythonArgs);
std::cout<<"child after exec"<<std::endl;
close(pipe_py_to_cpp[0]);
close(pipe_cpp_to_py[1]);
close(pipe_py_to_cpp[1]);
close(pipe_cpp_to_py[0]);
std::cout<<"child terminated"<<std::endl;
}
else if (pid < 0)
{
std::cout << "Fork failed." << std::endl;
exit(1);
}
else
{
std::cout<<"parent started"<<std::endl;
std::cout<<"parent terminated"<<std::endl;
exit(0);
}
std::cout<<"cpp terminated"<<std::endl;
return 0;
}
Python 文件:
import os
import time
import struct
if __name__ == "__main__":
print("in python")
exit()
输出:
ece:~/cpp> ./Pipetest
parent started
parent terminated
child started
child before exec
ece:~/cpp> in python
(blinking cursor here)
对于 C++ 文件,如果我删除 fork 命令并在主函数中简单地调用 exec() 来执行 Python 程序,它将按预期运行并成功终止。谁能告诉我这是怎么回事?
更新:感谢您的所有回答!现在我看到 exec() 之后的代码不会被执行。但是,输出仍然让我感到困惑,因为新的命令提示符没有出现(在我的例子中,它是 ece:~/cpp>)。事实上,它只有在我输入内容后才会出现。即使我用 system() 替换 exec() 也会发生这种情况。为什么会这样?
您没有 wait
在 child 过程中,因此 parent 退出 期间(或者,如您的示例所示输出,之前) Python 的(相对较长的)启动时间和 shell 在 child 打印任何内容之前打印下一个提示。您可以看到,如果您在“(此处闪烁的光标)”行中键入任何内容,它将 执行 作为下一个 shell 命令。
我正在尝试从 C++ 使用 exec() 到 运行 Python,并使用管道在进程之间进行通信。我发现 C++ 进程在 Python 进程终止后继续等待 exec() 命令,这导致它无法执行该行下面的代码。
请检查我下面的代码(我已将问题最小化,因此删除了实际通信部分)
C++ 文件:
int main()
{
int pipe_cpp_to_py[2];
int pipe_py_to_cpp[2];
if (pipe(pipe_cpp_to_py) || pipe(pipe_py_to_cpp))
{
std::cout << "Couldn't open pipes" << std::endl;
exit(1);
}
pid_t pid = fork();
if (pid == 0)
{
std::cout<<"child started"<<std::endl;
char *intrepreter="python3";
char *pythonPath="./Pipetest.py";
char *pythonArgs[]={intrepreter,pythonPath,NULL};
std::cout<<"child before exec"<<std::endl;
execvp(intrepreter,pythonArgs);
std::cout<<"child after exec"<<std::endl;
close(pipe_py_to_cpp[0]);
close(pipe_cpp_to_py[1]);
close(pipe_py_to_cpp[1]);
close(pipe_cpp_to_py[0]);
std::cout<<"child terminated"<<std::endl;
}
else if (pid < 0)
{
std::cout << "Fork failed." << std::endl;
exit(1);
}
else
{
std::cout<<"parent started"<<std::endl;
std::cout<<"parent terminated"<<std::endl;
exit(0);
}
std::cout<<"cpp terminated"<<std::endl;
return 0;
}
Python 文件:
import os
import time
import struct
if __name__ == "__main__":
print("in python")
exit()
输出:
ece:~/cpp> ./Pipetest
parent started
parent terminated
child started
child before exec
ece:~/cpp> in python
(blinking cursor here)
对于 C++ 文件,如果我删除 fork 命令并在主函数中简单地调用 exec() 来执行 Python 程序,它将按预期运行并成功终止。谁能告诉我这是怎么回事?
更新:感谢您的所有回答!现在我看到 exec() 之后的代码不会被执行。但是,输出仍然让我感到困惑,因为新的命令提示符没有出现(在我的例子中,它是 ece:~/cpp>)。事实上,它只有在我输入内容后才会出现。即使我用 system() 替换 exec() 也会发生这种情况。为什么会这样?
您没有 wait
在 child 过程中,因此 parent 退出 期间(或者,如您的示例所示输出,之前) Python 的(相对较长的)启动时间和 shell 在 child 打印任何内容之前打印下一个提示。您可以看到,如果您在“(此处闪烁的光标)”行中键入任何内容,它将 执行 作为下一个 shell 命令。