Tengo un problema con Bash y no sé por qué.
Debajo de la concha, entro:
echo $$ ## print 2433
(echo $$) ## also print 2433
(./getpid) ## print 2602
"getpid" es un programa en C para obtener pid actual, como:
int main() { printf("%d", (int)getpid()); return 0; }
Lo que me confunde es que:
- Creo que "(comando)" es un subproceso (¿estoy en lo cierto?), Y creo que su pid debería ser diferente con su padre pid, pero son lo mismo, por qué ...
- cuando uso mi programa para mostrar pid entre paréntesis, el pid que muestra es diferente, ¿es correcto?
- ¿Es '$$' algo así como macro?
¿Me puedes ayudar?
getpid
mostraría una ID de proceso diferente incluso si no se ejecutara en una subshell.echo $$ $BASHPID ; ( echo $$ $BASHPID )
demuestra que sí. Los corchetes crean una subshell. Las declaraciones pueden cambiar los valores de las variables y el shell principal no debe ver esos cambios. Esto se implementa como unafork()
operación.Respuestas:
$$
se define para devolver el ID de proceso del padre en una subshell; de la página del manual bajo "Parámetros especiales":En
bash
4, puede obtener el ID de proceso del niño conBASHPID
.fuente
echo $$; (echo $$; (echo $$))
repite el mismo pedido tres veces$ Expands to the process ID of the shell
lo hace?echo $
solo hace eco del literal $.$
solo no es una expansión de parámetros. La página del manual se refiere al nombre del parámetro especial, que es$
; no dice que$
solo se expanda.echo $BASHPID
funciona en bash 4 y 5 (pero no en la versión 3.2.57 en MacOS)Puede usar uno de los siguientes.
$!
es el PID del último proceso en segundo plano.kill -0 $PID
comprueba si aún se está ejecutando.$$
es el PID del shell actual.fuente
kill -0 $!
si estamos hablando de procesos en segundo plano?PID
no está configurado en nada de forma predeterminada.$$
es un alias en Bash para el script PID actual . Vea las diferencias entre$$
y$BASHPID
aquí , y justo encima de esa variable adicional$BASH_SUBSHELL
que contiene el nivel de anidamiento.fuente
Pruebe
getppid()
si desea que su programa C imprima el PID de su shell.fuente
Si estuviera preguntando cómo obtener el PID de un comando conocido, se parecería a algo como esto:
Si emitió el comando a continuación #El comando emitido fue ***
Entonces usarías:
Lo que sucede aquí es que canaliza todos los caracteres únicos necesarios a un campo y ese campo puede repetirse usando
echo $ PID
fuente
Esta es una forma universal de obtener el pid correcto
pid=$(cut -d' ' -f4 < /proc/self/stat)
mismo bien trabajado para sub
verificar salida
fuente