#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
, не будут работать.