如何以可移植的方式创建流程?

Posted

技术标签:

【中文标题】如何以可移植的方式创建流程?【英文标题】:How can I create a process in a portable manner? 【发布时间】:2009-11-09 21:19:02 【问题描述】:

我正在尝试编写一个需要创建其他进程的程序。我已经习惯了 Windows API,但现在我需要我的程序也能够在 Linux 平台上运行。

是否可以以便携的方式进行?我必须为此目的使用预处理器吗?

编辑:我需要等待它完成才能继续做事。

【问题讨论】:

【参考方案1】:

在我看来,应该始终避免使用系统函数:它不可靠,因为您不知道哪个 shell 会处理您的命令,并且它没有办法返回一个明确的错误代码。此外,在 Windows 等进程非常重的平台上,启动一个新进程只是为了启动另一个进程并不是一个好主意,顺便说一下,一些安全套件可能会为您的应用程序尝试启动的每个进程发出警告,并且将此通知加倍(一个用于命令解释器,一个用于实际启动的应用程序)可能会加倍惹恼用户。

如果您只需要创建一个新进程,您可以只围绕实际的平台特定代码创建包装函数,这将在编译程序时自动选择,这要归功于预处理器。像这样的:

int CreateProcess(const char * Executable, const char * CommandLine)

#if defined (_WIN32)
    return CreateProcess(Executable, CommandLine /* blah blah blah */)!=FALSE;
#elif defined (_POSIX)
    /* put here all the usual fork+exec stuff */
#else
    #error The CreateProcess function is not defined for the current platform.
#endif

顺便说一下,该函数可以很容易地扩展为阻塞,您可以简单地添加一个标志(int Blocking,或者现在在 C99 中用于布尔值的任何东西),它将触发 win32 部分的 WaitForSingleObject 和 waitpid用于 POSIX 部分。

【讨论】:

【参考方案2】:

API 不同,因此无法绕过编写两段代码或链接到执行相同操作的库。

Apache Portable Runtime 是用 C 编写可移植低级程序的好选择。

【讨论】:

【参考方案3】:

您需要对其他线程的控制程度如何?如果只是启动它们是一件简单的事情,那么system() 函数可能是一个不错的选择。如果您想对它们进行更多控制,我会查看图书馆。我知道Qt 让多进程编程的某些方面变得相当容易。

【讨论】:

Qt 似乎是我需要的一个相当大的项目,如果我可以静态链接到它,生成的可执行文件会膨胀吗?它似乎也是针对 C++ 开发的,我正在做纯 C。 我只想指出,从 4.0 版本开始,Qt 已经被分解成可以使用的更小部分,因此不再存在大的单一依赖项。 @Jeff,我同意 supercheetah 的观点......他们已经做到了,所以如果你不需要它,你可以跳过 GUI 部分。此外,如果您制作多个程序,您可以将 Qt 部分作为共享库或 dll 分发,这样可以节省一些空间。然而,它仍然相当大。你也可以考虑 boost.interprocess:boost.org/doc/libs/1_35_0/doc/html/interprocess.html【参考方案4】:

尝试在 Posix 和 Windows 上都存在的 system()。

@Jeff - system() 是一个阻塞调用,直到子进程退出才会返回。

【讨论】:

它打开一个命令行并在那里执行命令。我需要等待它完成才能继续做事,所以我认为它不适合我的需要。还是谢谢! @Jeff - system() 是同步的。你的 pgm 会一直等到它完成。

以上是关于如何以可移植的方式创建流程?的主要内容,如果未能解决你的问题,请参考以下文章

如何以可移植的方式在 C 中执行算术右移?

以可移植的方式使用 DB Api

以可移植数据格式保存/加载 scipy sparse csr_matrix

可移植地在 autoconf/automake 中包含 GLib 标头

如果我以可移植性为目标,我应该对具有负值的字符使用带符号的字符吗?

是否有一种可移植的方式在 Makefile 中制作可移植的可选依赖项?