【发布时间】:2021-08-11 07:13:00
【问题描述】:
在从 Spotlight 或 Applications 文件夹启动应用程序之前,我无法运行一些 C 代码。我想我应该能够用我的代码创建一个可执行文件,在所有计算完成后我调用execvp() 来运行原始应用程序的可执行文件,然后它将替换当前进程。
我编译了 .c 文件并为其提供了原始应用程序的可执行名称(在我的情况下为 clion),然后从终端执行它.. 太好了,它有效!.. 直到我尝试打开来自 Spotlight(或 Finder)的应用程序包
由于某种原因,execvp() 调用失败,原始程序继续运行,但我的自定义可执行文件确实被聚光灯调用了!甚至使用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 时,它说两个 调用 failed,表示execvp()调用失败。
【问题讨论】:
-
在
execvp调用后检查status和errno的值。 -
状态为-1,errno为2