
Como todos sabemos, cuando reiniciamos, apagamos o iniciamos un sistema, se imprimirá algún mensaje en la pantalla, aquí una captura:
Mi sistema es Ubuntu 16.04, sé que estos mensajes de registro anteriores provienen de systemd.
Según tengo entendido, un proceso de usuario normal puede imprimir cosas en la pantalla porque el sistema le proporciona tres descriptores de archivos: 0, 1 y 2. Podemos encontrarlos en /proc/<PID>/fd/
. Aquí hay un ejemplo:
root@X86-Xenial-6:~# ls /proc/3467/fd
0 1 2 255
Es 3467
un programa de hola mundo, no sé qué 225
es, pero lo sé 0
, 1
y 2
son entrada estándar, salida estándar y error estándar.
Entonces, tengo una pregunta: cuando el sistema comienza a apagarse, reiniciarse o iniciarse, el proceso de usuario no se ha creado o ha sido destruido, lo que significa que /proc/
ya no existe, en este caso, 0
y 1
no 2
existe. .
Entonces, ¿por qué el mensaje procedente de systemd se puede imprimir en la pantalla? El kernel podría imprimir cosas porque controla la pantalla inmediatamente, pero no creo que systemd pertenezca al kernel, entonces, ¿cómo podría imprimir cosas en la pantalla también? ¿Qué tipo de función o api se utiliza?
Respuesta1
El inicio y el apagado se realizan en gran medida en el espacio del usuario, no en el kernel. Tan pronto como el kernel termina de inicializarse, lo busca init
y lo inicia, como un proceso normal, con los descriptores de archivos estándar apuntando a la consola. Entonces init
(en su caso, el script initramfs y luego systemd) puede escribir en su salida estándar y todo lo que escriba aparecerá en la pantalla (o dondequiera que la salida de la consola esté configurada para aparecer). Este continúa siendo el caso hasta que el kernel se apaga o se reinicia, lo que ocurre después de que se cierra el espacio del usuario (y después de que todos los registros de apagado se hayan escrito en la consola).
Además, tenga en cuenta que /proc
es sólo un medio para acceder a cierta información mantenida por el núcleo; Esas piezas de información existen ya sea que /proc
estén montadas o no.
Tenga en cuenta también que
Como todos sabemos, cuando reiniciamos, apagamos o iniciamos un sistema, se imprimirá algún mensaje en la pantalla.
Esto no es necesariamente cierto: muchos sistemas ahora arrancan y se apagan sin mostrar registros, por lo que no podemos asumir que “todos lo sabemos”.
Respuesta2
Una respuesta breve, para aclarar algunos malentendidos.
- El proceso se realiza en el espacio del usuario: específicamente
init
el primer proceso del usuario. - No necesita /proc para que existan descriptores de archivos. Si la única forma de acceder a los descriptores de archivos fuera a través de un archivo, ¿cómo accedería a un descriptor de archivo? (abriría el archivo y
/proc
se le devolvería un descriptor de archivo, intentaría buscarlo en/proc
un descriptor de archivo…)./proc
es solo una vista, solo la necesitan los procesos que informan sobre otros procesos. - El descriptor de archivo 255
ls
en su ejemplo es del directorio/proc/3467/fd
:ls
tiene que abrir el directorio, por lo que esperamos un descriptor de archivo adicional. Tenemos uno extra, así que esto es lo que es. /proc/fd/1
etc apuntan a otros dispositivos. p.ej1 -> /dev/pts/3
. hacer unls -l /proc/self/fd
- Cuando se inicia el kernel,
init
conectará su stdin, stdout, stderr a la pantalla (un dispositivo tty que se muestra en la pantalla) o a otro lugar. init
es el proceso1
(en su sistemasystemd
).