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

时间:2010-12-01 16:42:33

标签: c macos process exec fork

我正在开发一个相对简单,独立的“进程启动器”,我希望能够在Windows(XP,Vista,7),Linux(Ubuntu 10.10)上工作,特别是 Mac OS X (10.6)。 Linux和Windows基本上都可以工作,但我在使用Mac版时遇到了一些麻烦。 我希望fork()exec()函数在Mac OS下可以像在Linux中一样工作。所以我的第一个问题是:

  1. 我应该用这些来创建一个 在Mac上的过程还是有的 平台特定的功能 使用吗
  2. 我当前的代码(在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
    {
        //[...]
    }
    

    任何想法是否可以在Mac OS X下运行,因为我的子进程根本没有启动,而且没有错误会出现。

    谢谢!

2 个答案:

答案 0 :(得分: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;
}

我建议你从这个简单的片段开始,如果有效,请继续添加内容,直到找到使其中断的内容。

答案 1 :(得分:5)

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