Невозможно аннулировать launchd kextcache из исполняемого файла помощника

Я создал деинсталлятор, который вызывает исполняемый файл помощника с повышенными правами для удаления launchd-plist моего драйвера, чтобы он не появлялся снова в следующем цикле загрузки.

Для того, чтобы отразить новый этап /Library/LaunchDaemonsЯ делаю недействительным kextcache с помощью следующей команды touch /Library/Extensions/ показал в этом вопросе.

Тем не менее, когда я делаю это из исполняемого файла помощника сразу после удаления файла plist, это не может быть выполнено, и мой драйвер продолжает работать после перезагрузки. Когда я делаю это вручную, набрав команду touch /Library/Extensions сразу после окончания работы помощника по удалению программа делает свое дело.

вот как выглядит мой код в первом варианте (сделать недействительным из помощника exec).

        remove(OSX_LAUNCHD_PLIST_PATH);
        pid_t pid = -1;
        char const * args[] = {"touch", "/Library/Extensions", NULL};
        posix_spawn(&pid, "/usr/bin/touch", NULL, NULL, (char **)args, NULL);
        waitpid(pid, &status, WNOHANG|WUNTRACED);

возможно, вы могли бы сказать мне, почему я получаю различное поведение в каждом из вариантов.

ОБНОВИТЬ:

Похоже, что аннулирование кэша требует повторения этой команды более одного раза. Этот код работал для меня, но я понятия не имею, почему...

        for (int x=0 ; x < 2; x++ ) {
            char const * args[] = {"touch", "/Library/Extensions", NULL};
            posix_spawn(&pid, "/usr/bin/touch", NULL, NULL, (char **)args, NULL);
            waitpid(pid, &status, WNOHANG|WUNTRACED);
            char const * args2[] = {"touch", "/System/Library/Extensions", NULL};
            posix_spawn(&pid, "/usr/bin/touch", NULL, NULL, (char **)args2, NULL);
            waitpid(pid, &status, WNOHANG|WUNTRACED);
        }

0 ответов

Другие вопросы по тегам