在从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时,它说called和failed
Errno 2是ENOENT
,也就是";没有这样的文件或目录";。
您需要确保执行clion
二进制文件的当前工作目录实际设置为二进制文件所在的目录,否则像./clion-real
这样的相对路径将不起作用。