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



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

我编译了.c文件,并给它提供了原始应用程序的可执行文件名(在我的情况下是clion(,然后从终端执行它。。太好了,它很管用!。。直到我尝试从聚光灯(或Finder(打开应用程序捆绑包

由于某种原因,execvp()调用失败,原始程序继续运行,但我的自定义可执行文件确实被聚光灯调用了!即使使用fork()创建子进程也无法工作,system()调用也无法工作。这里可能有什么问题?

CLion的内容文件夹:CLion是我的可执行文件,Clionreal为原始可执行

-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时,它说calledfailed

Errno 2是ENOENT,也就是";没有这样的文件或目录";。

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

最新更新