【问题标题】:How to create a process on Mac OS using fork() and exec()如何在 Mac OS 上使用 fork() 和 exec() 创建进程
【发布时间】:2011-05-18 14:54:56
【问题描述】:

我正在开发一个相对简单、独立的“进程启动器”,我想在 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 下工作,因为我的子进程根本没有启动,而不会出现任何错误。

谢谢!

【问题讨论】:

    标签: c macos process exec fork


    【解决方案1】:

    以下程序改编自您的代码,在 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;
    }
    

    我建议您从这个简单的片段开始,如果它有效,请继续添加内容,直到找到导致它崩溃的原因。

    【讨论】:

    • 好的 - 我想我知道我现在的问题是什么,我实际上试图访问父进程中的内存(以查找实际的子进程名称),这似乎失败了 - 任何建议如何我会这样做吗?更清楚一点:我需要在调用fork() 后访问任意应用程序名称,以将其传递给execv() 命令。
    • @Chris 您可能应该针对该问题创建一个新问题并用代码示例进行说明。一方面,我不确定我是否理解你在做什么。
    • 这只是我代码中的一个错误,我现在修复了 - 感谢您的帮助 - 这个示例真的很有帮助!
    • 正如 'fork' (developer.apple.com/library/mac/#documentation/Darwin/Reference/…) 的手册页所说:LEGACY SYNOPSIS #include &lt;sys/types.h&gt; #include &lt;unistd.h&gt; The include file &lt;sys/types.h&gt; is necessary. 也许是这样。
    【解决方案2】:

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

    【讨论】:

    • 谢谢贾斯汀 - 但 TestApplication 是一个“普通”的 unix 可执行文件,我自己构建并在 Windows 和 Linux 下使用没有问题 - 所以它不是一个应用程序包:(
    • 要回答您的原始问题,fork()execv() 都可以使用。在你尝试了execv() 之后,strerror() 会说什么?
    • hmm - 我真的不知道,因为 execv() 将在子进程中执行 & 我真的不知道如何在上述代码的 if 语句中调试该部分
    • 我试过这个:stackoverflow.com/questions/377195/… 但没用
    • 子进程会继承父进程的文件描述符,这应该包括stdoutstderr等,所以你也许可以这样做:fprintf(stderr, "Could not create child process: %s\n", strerror(errno))
    猜你喜欢
    • 1970-01-01
    • 2011-07-02
    • 2015-02-06
    • 2017-02-25
    • 2021-12-15
    • 2021-11-13
    • 2023-03-22
    • 2021-06-11
    • 2017-07-29
    相关资源
    最近更新 更多