Каков срок жизни дескриптора файла?

Хорошо, я больше не зависаю на странице консоли при загрузке и, следовательно, больше не вижу ошибок. Все, что я сделал, это переустановил Grub из Ubuntu, чтобы использовать его вместо Kali Grub. Может ли кто-нибудь сказать мне, почему?

РЕДАКТИРОВАТЬ

Я не уверен, исчезли ли ошибки, и что я их просто не вижу. Есть ли какой-нибудь способ решить эту проблему?

11
20.05.2018, 16:40
2 ответа

Brevemente:Es casi seguro que un shell cerrará los descriptores de archivos relacionados con las redirecciones inmediatamente después de que se complete el comando.


Detalles:No hay una mención explícita de cerrar los archivos abiertos a través de redirecciones en POSIX (por lo que puedo ver ). Pero no cerrarlos inmediatamente no sería muy útil.

Las reglas para el entorno en el que se inicia cualquier comando no permiten pasar descriptores de archivos adicionales. El shell debería tener cuidado de cerrar cualquier fd adicional que se guarde al iniciar un comando que no debería tenerlos.

Para las redirecciones de salida habituales > filename, en caso de que sea necesario truncar el archivo al iniciar cada comando, incluso si se guardó el descriptor del archivo. Y cualquier descriptor de archivo guardado apuntaría a un archivo incorrecto si el archivo en cuestión fuera renombrado o eliminado mientras tanto.

Por ejemplo, esto no se comportaría correctamente si el fd abierto para el primero echose mantuviera abierto y se usara como -para el segundo:

echo foo >> x; mv x y; echo bar >> x

El modelo habitual de fork+exec utilizado para iniciar programas externos también hace que sea muy fácil tener los archivos automáticamente cierra cuando sale el comando. El shell solo necesita fork()primero y abrir los archivos necesarios en el niño proceso, antes de llamar a exec()para reemplazar el niño con el comando real. Cuando el proceso hijo sale, todos los archivos abiertos por él se cierran automáticamente.


En awk, sin embargo, la sintaxis para la redirección de salida es similar al shell, pero los archivos abiertos se mantienen abiertos hasta el script sale, a menos que se cierre explícitamente. Esto solo se abrirá foouna vez, y tampoco lo truncará entre las impresiones:

awk 'BEGIN { print "a" > "foo"; print "b" > "foo" }'
4
27.01.2020, 19:59

Se cierran al terminar. El shell creará 3 descriptores de archivo 0,1,2 para cada comando que ejecute. Estos son solo números, los números se reutilizan. El shell cerrará los archivos antes de re -usando los descriptores.

Los descriptores de archivo también se pasan a otros procesos. Y si tiene un proceso en segundo plano, seguirá teniendo descriptores de archivo.

El ejemplo utiliza 3>&1, lo que significa que el descriptor de archivo 3 hace referencia al archivo al que se refiere actualmente el descriptor 1.

6
27.01.2020, 19:59

Теги

Похожие вопросы