【问题标题】:Running custom code before launching app macOS在启动应用程序 macOS 之前运行自定义代码
【发布时间】: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调用后检查statuserrno的值。
  • 状态为-1,errno为2

标签: c execvp


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2019-06-13
    • 2023-03-20
    • 2015-10-05
    • 2018-08-09
    • 2016-12-31
    • 2013-05-19
    • 2013-11-16
    • 1970-01-01
    • 2015-02-12
    相关资源
    最近更新 更多