运行 启动应用程序之前的自定义代码 macOS

Running custom code before launching app macOS

在从 Spotlight 或“应用程序”文件夹启动应用程序之前,我在 运行 一些 C 代码时遇到了问题。我想我应该能够用我的代码创建一个可执行文件,在完成所有计算后,我对 运行 原始应用程序的可执行文件进行 execvp() 调用,然后它将替换当前进程。

我编译了 .c 文件并为其指定了原始应用程序的可执行文件名称(在我的例子中为 clion),然后从终端执行它。太棒了,它有效!...直到我尝试从 Spotlight(或 Finder)打开应用程序包

由于某种原因,execvp() 调用失败,原始程序继续运行,但我的自定义可执行文件确实被 spotlight 调用了!甚至用 fork() 创建子进程都行不通, system() 调用也不行。这可能是什么问题?

CLion 的目录:clion 是我的可执行文件,clion-real 是原始可执行文件

-rwxr-xr-x  1 marc  admin    8700 22 Mai 10:35 clion
-rw-r--r--  1 marc  admin     550 22 Mai 10:35 clion-fake.c
-rwxr-xr-x@ 1 marc  admin  128353 21 Mai 12:56 clion-real

clion-fake.c

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char** argv) {
    system("say 'called'");
    char* args[] = {"./clion-real", NULL};
    int status = execvp(args[0], args);
    system("say 'failed'");
    return 0;
}

当从终端调用 ./clion 时,它按预期工作,系统说 调用 并且应用程序打开,但是当从 Spotlight 打开 .app 时,它显示 [= =31=]called 和 failed,这意味着 execvp() 调用失败。

Errno 2 是 ENOENT,又名“没有这样的文件或目录”。

您需要确保执行 clion 二进制文件的当前工作目录实际上设置为您的二进制文件所在的目录,否则像 ./clion-real 这样的相对路径不会工作。