Как создать процесс в Mac OS с использованием fork () и exec () - PullRequest
9 голосов
/ 01 декабря 2010

Я работаю над относительно простым, независимым « началом процесса », которое я хотел бы заставить работать на 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
{
    //[...]
}

Любая идея, может ли это работать и в Mac OS X, потому что мой дочерний процесспросто не запускается, в то время как нет никаких ошибок, которые могут появиться.

Спасибо!

Ответы [ 2 ]

12 голосов
/ 01 декабря 2010

Следующая программа, адаптированная из вашего кода, прекрасно работает для меня под 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;
}

Я предлагаю вам начать с этого простого фрагмента, и если он работает, продолжайте добавлять вещи, пока не найдетеломает.

5 голосов
/ 01 декабря 2010

Является ли TestApplication фактическим исполняемым файлом или комплектом приложений (.app)?Вы можете запускать только исполняемые файлы, используя такие функции, как execv().Обычно исполняемый файл внутри пакета приложения можно найти по адресу ApplicationName.app/Contents/MacOS/ApplicationName.

...