Al intentar redirigir la salida del programa con la sintaxis "algún número mayor que" (por ejemplo foo 2> myfile
), ¿cuáles son los números posibles aquí y qué representan?
Creo que 1 es /dev/stdout
, 2 es /dev/stderr
. ¿Qué hay de 5 y 6? ¿Hay 3, 4 o algún número mayor que 6?
io-redirection
file-descriptors
fifo
Estudiante de Fermat
fuente
fuente
Respuestas:
Este supuesto programa escribirá en el número de descriptor de archivo que especificó. considere el siguiente programa hello world:
compilarlo
ahora una carrera simple
no hay archivo para 5, por lo que no se escribió ningún byte.
siguiente intento:
Me las arreglo para obtener un resultado al especificar un archivo y un descriptor de archivo (por ejemplo
5>u
).En la práctica, a menos que haya escrito un programa tan divertido como el anterior, es poco probable que recopile datos utilizando
5>foo
.en el script de shell, construir usando <() son más útiles:
fuente
write()
vuelvessize_t
, noint
.Los números representan descriptores de archivo (identificadores de archivos que se han abierto).
El caparazón generalmente tiene 3 conjuntos automáticamente,
0 - stdin 1 - stdout 2 - stderr
Pero se pueden abrir más archivos y aumentar los números.
fuente
Esos números son descriptores de archivos . Como notó, hay varios que se crean automáticamente. A medida que se abran otros archivos o elementos similares, obtendrán otros números.
Los números que se usan en cualquier programa en particular dependen de qué archivos han sido abiertos por ese programa o usados de otra manera. Por ejemplo, si desea "guardar" el stdin actual y redirigir temporalmente el stdin desde otro lugar y luego restaurarlo más tarde, puede hacer algo como:
Por lo tanto, este script tendría un
4
descriptor de archivo disponible al menos durante algún tiempo. Sin embargo, ese 4 podría ser cualquier cosa que no esté en uso (bueno, hay un límite para la cantidad de archivos que puede abrir un proceso, pero cualquier cosa dentro de ese límite).Puede ver a qué descriptores de archivo se ha abierto un proceso, y dónde están abiertos mirando
/proc/<pid>/fd
. Eso muestra todos los descriptores de archivos abiertos para ese proceso<pid>
y con qué archivos están asociados.fuente
Cualquier proceso obtiene números enteros como descriptores de archivo, donde hay tres reservados en POSIX: 0 es stdin, 1 es stdout y 2 es stderr. A cualquier archivo adicional se le asignarán más números. Puede verificarlo fácilmente con este programa, guárdelo como fdtest.c , para que abra su propio código de programa durante el tiempo de ejecución:
Compilarlo:
Ejecutarlo:
La salida que obtendrá es algo como esto:
... que es el número del descriptor de archivo del archivo al que hace referencia la variable
fd
.fuente