c++ - 在 C++ 应用程序中启动进程并处理它

标签 c++ linux process fork pid

我正在编写一个 c++ 应用程序(在 Linux 中),我想在其中启动另一个应用程序,但只启动一次。 (如果它已经打开,则使用那个的 handle)。

我也时不时想为相同的应用程序提供输入。例如:

    class myapp():
        start second application here.
        work()
    myapp::work(){
        create input
        provide input to the started/already open second application
    }

因此,每次为 myapp 创建一个对象时,都会启动第二个应用程序(仅当它尚未打开时)。然后每次都将输入传递给应用程序?那可能吗?我也不希望第二个应用程序关闭,除非用户结束它。 我已经在使用 pid 和 fork 来做到这一点。但不知何故,它多次启动应用程序,我都无法向该应用程序提供输入。

希望这已经足够清楚了。我知道已经有很多关于此的问答,但我无法清楚地理解,因此如果我再次问同样的问题,我深表歉意?

感谢帮助

最佳答案

popen是这项工作的正确工具。您向它传递一个要执行的命令,它会返回一个 C 文件句柄 (FILE *),它表示从您的程序到第二个程序的管道。您使用此句柄写入的所有数据都定向到第二个程序的标准输入。

请注意,这是一个 C 文件句柄,因此您需要使用 C I/O 函数,例如 fprintf写信给它。遗憾的是,没有将 C 文件句柄转换为 C++ 输出流的标准方法。

这里是一个如何使用 popen 的例子,改编自 example in the GNU libc manual :

FILE *pipe = popen("wireshark -i -k", "w"); // "w" means "write mode"
if (!pipe) {
    // execution failed
    return;
}

fprintf(pipe, "Some data");
…

// When you're done with the pipe:
pclose(pipe);

您可以通过将管道 FILE * 存储在用 NULL 初始化的永久变量(例如对象成员变量)中来确保程序只启动一次.然后,您可以轻松检查是否已经使用 pipe != NULL 启动了第二个应用程序。

关于c++ - 在 C++ 应用程序中启动进程并处理它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17910427/

相关文章:

c++ - 平方差的数值精度

c++ - 调用 glBufferData 是否创建/释放缓冲区?

c - libudev 返回重复的 USB 设备

linux - gettext 编译在 cygwin 上的 crosstool-ng 构建中失败

c# - 如何中止长时间运行的方法?

javascript - 如何在 Node 中的 process.exit 之后启动另一个进程

c++ - DirectX 纹理未正确绘制

c++ - 在 ';' 之前缺少 '*'

linux - 如何将频率缩放驱动程序从 "intel-pstate"更改为 "acpi-cpufreq"或 "p4-clockmod"?

c# - 使用 Process、RegistryKey 将 .NET Framework 代码移植到 .NET Standard