如何使用fork()和exec()在Mac OS上创建进程

Chr*_*ris 9 c macos fork process exec

我正在研究一个相对简单,独立的" 流程启动器 ",我希望能够在Windows(XP,Vista,7),Linux(Ubuntu 10.10)以及Mac OS X(10.6)上工作.Linux和Windows基本上都可以工作,但我在使用Mac版时遇到了一些麻烦.我希望fork()exec()功能将工作在Mac OS同样的方式,因为他们在Linux下工作.所以我的第一个问题是:

  1. 我应该使用它们在Mac上创建进程还是要使用任何特定于平台的功能?

我当前的代码(在Linux下工作正常)来调试它看起来像这样:

pid_t processId = 0;
if (processId = fork()) == 0)
{
    const char * tmpApplication = "/Path/to/TestApplication";

    int argc = 1;
    char * argv[argc + 1];

    argv[0] = tmpApplication;
    argv[1] = NULL;

    execv(tmpApplication, argv);
}else
{
    //[...]
}
Run Code Online (Sandbox Code Playgroud)

不知道这是否可以在Mac OS X下运行,因为我的子进程根本没有启动,而没有出现错误.

谢谢!

Ark*_*kku 12

以下程序改编自您的代码,在OS X下对我来说效果很好:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>

int main (void) {
    pid_t processId;
    if ((processId = fork()) == 0) {
        char app[] = "/bin/echo";
        char * const argv[] = { app, "success", NULL };
        if (execv(app, argv) < 0) {
            perror("execv error");
        }
    } else if (processId < 0) {
        perror("fork error");
    } else {
        return EXIT_SUCCESS;
    }
    return EXIT_FAILURE;
}
Run Code Online (Sandbox Code Playgroud)

我建议你从这个简单的片段开始,如果它工作,继续添加东西,直到找到使它破坏的东西.


Jus*_*ers 5

TestApplication实际的可执行文件,还是应用程序包(.app)?您只能使用像这样的函数启动实际的可执行文件execv().通常可以在应用程序包中找到可执行文件ApplicationName.app/Contents/MacOS/ApplicationName.