2

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

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

编辑:在继续做事情之前,我需要等待它完成。

4

4 回答 4

3

在我看来,应该始终避免使用 system 函数:它不可靠,因为您不知道哪个 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 和 POSIX 的 waitpid部分。

于 2009-11-25T21:09:55.290 回答
1

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

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

于 2009-11-09T22:16:07.947 回答
0

尝试 system(),因为它在 Posix 和 Windows 上都存在。

@Jeff - system() 是一个阻塞调用,在子进程退出之前它不会返回。

于 2009-11-09T21:21:14.123 回答
0

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

于 2009-11-09T21:31:23.843 回答