Как ps показывает argv для всех процессов в Mac OS X?
Вопрос
Я пытаюсь определить, когда конкретный процесс запущен, на основе его аргументов в Mac OS X. Может быть несколько процессов, работающих с одним и тем же именем, но только один будет иметь аргументы, которые я ищу.Процессы не принадлежат тому же пользователю, который будет запускать мой код.Они никоим образом не будут изменять свой argv.
Команда 'ps' показывает именно ту информацию, которая мне нужна.Но я бы очень предпочел не порождать 'ps' и анализировать его вывод.
Первоначально я пробовал решение из этого вопроса , используя sysctl, но оказалось, что это работает только для ваших процессов;см. мой другой вопрос для получения дополнительной информации.
Так как же ps получает информацию argv для процессов, принадлежащих другим пользователям?
Решение
В Mac OS X для ps установлен uid 0, с помощью которого он получает информацию для всех процессов.Чтобы получить эту информацию, вы должны работать как root, поэтому вам нужно либо установить uid 0, либо запустить утилиту с помощью sudo.
Вероятно, лучший способ - просто запустить ps и проанализировать вывод, даже если вы этого не хотите;)
Другие советы
BSD ps
(используется в Mac OS X) использует код kvm_getargv()
для получения аргументов командной строки для процесса.
Вот настоящий вызов: ps исходный код .Найдите код сгенерированного тега.
См. OpenBSD.справочную страницу для этого семейства функций.