Запуск пользовательского кода перед запуском приложения macOS

#c #execvp

Вопрос:

У меня возникли проблемы с запуском кода на C перед запуском приложения из Spotlight или папки приложений. Я решил, что мне нужно просто создать исполняемый файл с моим кодом, где после выполнения всех вычислений я сделаю execvp() вызов для запуска исполняемого файла исходного приложения, который затем заменит текущий процесс.

Я скомпилировал файл .c и дал ему имя исполняемого файла исходного приложения (в моем случае clion), а затем выполнил его из терминала.. отлично, это работает!.. Пока я не попытался открыть пакет приложений из spotlight (или Finder)

По какой-то причине execvp() вызов завершается неудачно, и исходная программа продолжается, но мой пользовательский исполняемый файл действительно вызывается spotlight! Даже создание дочернего процесса с fork() помощью will не сработает, как 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
 

клион-подделка.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 с терминала он работает так, как задумано, система говорит «вызвано«, и приложение открывается, но при открытии .app из Spotlight в нем говорится как «вызвано«, так и «не удалось«, что означает, что execvp() вызов не удался.

Комментарии:

1. Проверьте значения status и errno после execvp вызова.

2. статус -1, ошибка-2

Ответ №1:

Ошибка 2 ENOENT , она же «такого файла или каталога нет».

Вам нужно убедиться, что текущий рабочий директорий для выполнения вашего clion двоичного файла фактически установлен в каталог, в котором находятся ваши двоичные файлы, иначе относительные пути, такие как ./clion-real , не будут работать.