Estou com um problema com o Bash e não sei por que.
Sob shell, insiro:
echo $$ ## print 2433
(echo $$) ## also print 2433
(./getpid) ## print 2602
"getpid" é um programa em C para obter o pid atual, como:
int main() { printf("%d", (int)getpid()); return 0; }
O que me confunde é o seguinte:
- Eu acho que "(comando)" é um subprocesso (estou certo?), E acho que seu pid deve ser diferente do pid pai, mas são os mesmos, por que ...
- Quando eu uso meu programa para mostrar pid entre parênteses, o pid mostra é diferente, está certo?
- '$$' é algo como macro?
Pode me ajudar?
getpid
mostraria um ID de processo diferente, mesmo que não fosse executado em um subshell.echo $$ $BASHPID ; ( echo $$ $BASHPID )
demonstra que sim. Parênteses arredondados criam um subshell. As instruções podem alterar os valores das variáveis e o shell pai não deve ver essas alterações. Isso é implementado como umafork()
operação.Respostas:
$$
é definido para retornar o ID do processo do pai em um subshell; na página do manual em "Parâmetros especiais":Em
bash
4, você pode obter o ID do processo da criançaBASHPID
.fonte
echo $$; (echo $$; (echo $$))
ecoa o mesmo pid três vezes$ Expands to the process ID of the shell
isso tho?echo $
apenas ecoa o literal $.$
sozinho não é uma expansão de parâmetro. A página de manual está se referindo ao nome do parâmetro especial, que é$
; não está afirmando que$
só se expande.echo $BASHPID
obras em festa de 4 e 5 (mas não a versão 3.2.57 em MacOS)Você pode usar um dos seguintes.
$!
é o PID do último processo em segundo plano.kill -0 $PID
verifica se ainda está em execução.$$
é o PID do shell atual.fonte
kill -0 $!
se estamos falando de processos em segundo plano?PID
não está definido para nada por padrão.$$
é um alias no Bash para o script atual PID . Veja as diferenças entre$$
e$BASHPID
aqui , e logo acima da variável adicional$BASH_SUBSHELL
que contém o nível de aninhamento.fonte
Tente
getppid()
se você deseja que seu programa C imprima o PID do seu shell.fonte
Se você estava perguntando como obter o PID de um comando conhecido, ele se pareceria com algo assim:
Se você emitiu o comando abaixo #O comando emitido foi ***
Então você usaria:
O que acontece aqui é canalizar todos os caracteres exclusivos necessários para um campo e esse campo pode ser repetido usando
echo $ PIDs
fonte
esta maneira univesal de obter pid correto
pid=$(cut -d' ' -f4 < /proc/self/stat)
mesmo bom trabalhou para sub
verificar saída
fonte