Como o PS mostra o ARGV para todos os processos no Mac OS X?
Pergunta
Estou tentando identificar quando um processo específico está em execução, com base em seus argumentos, no Mac OS X. Pode haver vários processos em execução com o mesmo nome, mas apenas um terá os argumentos que estou procurando. Os processos não pertencem ao mesmo usuário que estará executando meu código. Eles não terão modificado seu ARGV de forma alguma.
O comando 'PS' mostra exatamente as informações que eu preciso. Mas eu preferiria muito não ter que gerar 'PS' e analisar sua saída.
Eu tentei originalmente a solução de essa questão, usando o SySCTL, mas acontece que só funciona para processos que você possui; Vejo minha outra pergunta para mais informações.
Então, como o PS obtém informações de argv para processos pertencentes a outros usuários?
Solução
No Mac OS X PS, é setuid 0, e é assim que obtém as informações para todos os processos. Você precisa ser executado como root para obter essas informações; portanto, precisa ser setuid 0 ou executar seu utilitário com sudo.
A melhor maneira é provavelmente apenas para gerar PS e analisar a saída, mesmo que você realmente não queira;)
Outras dicas
BSD ps
(usado no Mac OS X) usa kvm_getargv()
Para obter os argumentos de comando para um processo.
Aqui está a chamada real: Código -fonte do PS. Procurar por kvm_getproc2
.
Ver Página do OpenBSD Man Para esta família de funções.