Вопрос

Ниже приведен сокращенный (без проверки ошибок / пустых значений) фрагмент кода C / Obj-C, который использует sysctl для получения argv определенного процесса с PID 50.

родовое слово

Первый вызов sysctl (для определения размера массива строк argv) завершается успешно.Возвращенная длина составляет ~ 1600, больше, чем я ожидал, но я полагаю, что это разумно.Маллок добивается успеха.Второй вызов sysctl возвращает -1, устанавливая для errno значение 22, E_INVAL.

Я просмотрел другой код, в том числе код этот вопрос , но не вижу проблемы с моей.Что мне не хватает?

Это было полезно?

Решение

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

Аспект «больше, чем я ожидал» связан с тем, что возвращаются переменные среды процесса, а также аргументы командной строки.(Не ясно, в каком формате вся эта информация.)

Когда я спрашиваю о другом процессе пользователя, я получаю тот же EINVAL из второго сгенерированного кодового кода, который вы видели.Я предполагаю, что это считается необоснованным любопытством к процессам других людей, но вы могли бы подумать, что первый код генерирующего кода тоже не сработает.

(При запросе о несуществующем идентификаторе идентификатора первого кода кодового тега возникает ошибка EINVAL.)

Все это, кажется, в значительной степени недостаточно документировано: в Leopard, sysctl даже не отображается на странице руководства sysctl.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top