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?

getpidmostrarí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
bash4, 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 shelllo 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 $BASHPIDfunciona 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 $PIDcomprueba si aún se está ejecutando.$$es el PID del shell actual.fuente
kill -0 $!si estamos hablando de procesos en segundo plano?PIDno está configurado en nada de forma predeterminada.$$es un alias en Bash para el script PID actual . Vea las diferencias entre$$y$BASHPIDaquí , y justo encima de esa variable adicional$BASH_SUBSHELLque 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