如何以便携式方式创建过程?

问题描述:

我正试图编写一个需要创建一些其他进程的程序。我习惯了Windows API,但现在我需要我的程序能够在Linux平台上运行。如何以便携式方式创建过程?

是否有可能以便携的方式做到这一点?我是否必须为此使用预处理器?

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

尝试系统(),因为它存在于Posix和Windows上。

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

+0

它打开命令行并在其中执行命令。我需要等待它完成才能继续做事,所以我认为这不适合我的需要。不管怎么说,还是要谢谢你! – Jeff 2009-11-09 21:35:09

+0

@Jeff - system()是同步的。你的pgm会一直等到它完成。 – Duck 2009-11-09 22:20:51

你需要多少控制其他线程?如果只是简单地启动它们,那么system()函数可能是非常合适的。如果你想要更多的控制他们,我会看看一个图书馆。我知道Qt可以很容易地完成多进程编程的某些方面。

+0

Qt似乎是我需要的非常大的项目,如果我可以静态链接到它会导致可执行文件臃肿? 此外,它似乎是针对C++开发,我在做普通的C. – Jeff 2009-11-09 21:44:32

+1

我只是想指出,由于4.0版本,Qt的已经破裂成小碎片,可以用来使不再有一个大单一依赖。 – supercheetah 2009-11-09 22:15:48

+0

@Jeff,我同意supercheetah ...他们已经做到了,所以如果你不需要它,你可以跳过GUI部分。另外,如果你制作了多个程序,你可以将Qt部分作为共享库或dll分发,并以这种方式节省一些空间。但是,它仍然相当大。你也可以考虑boost.interprocess:http://www.boost.org/doc/libs/1_35_0/doc/html/interprocess.html – 2009-11-09 22:21:28

这些API是不同的,所以没有办法编写两段代码或链接到相同的库。

Apache可移植运行是应始终避免系统功能为C.

写便携式低一级的方案在我看来一个不错的选择:这是不可靠的,因为你不知道会怎样处理外壳你的命令,它没有办法返回你一个明确的错误代码。而且,在像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阻塞,或无论是现在在C99用于布尔值)将触发WaitForSingleObject用于win32部分,而waitpid用于POSIX部分。