Programa de redirección de salida

Respuestas:

11

Este supuesto programa escribirá en el número de descriptor de archivo que especificó. considere el siguiente programa hello world:

#include <stdio.h>

main()
{
   ssize_t i = 0 ;
   printf ("hello world\n") ;
   i = write( 5 , "Bonjour Monde\n", 14 ) ;
   printf ("%d octet dans 5\n", (int) i) ;
}

compilarlo

me@mybox:~/tmp7$ make hw
cc     hw.c   -o hw

ahora una carrera simple

me@mybox:~/tmp7$ ./hw
hello world
-1 octet dans 5

no hay archivo para 5, por lo que no se escribió ningún byte.

siguiente intento:

me@mybox:~/tmp7$ ./hw 5> u
hello world
14 octet dans 5
me@mybox:~/tmp7$ cat u
Bonjour Monde

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:

 diff <( cmd -par 1 ) <(cmd -par 2)
Archemar
fuente
write()vuelve ssize_t, no int.
Andrew Henle
Ese no es el punto principal de la pregunta, también hay un retorno para la función printf.
Archemar
No usar un valor devuelto es muy diferente de usar el tipo incorrecto .
Andrew Henle
editado No veo ningún cambio en la salida aunque ...
Archemar
10

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.

X Tian
fuente
7

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:

exec 4<&0
exec < /some/file
#process
exec 0<&4 4<&- # restore stdin and close our duplicate

Por lo tanto, este script tendría un 4descriptor 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.

Eric Renouf
fuente
0

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:

#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

int main()
{
    int fd = open("fdtest.c", O_RDONLY);
    printf("%d\n", fd);
    close(fd);
    return 0;
}

Compilarlo:

gcc fdtest.c -o fdtest

Ejecutarlo:

./fdtest

La salida que obtendrá es algo como esto:

3

... que es el número del descriptor de archivo del archivo al que hace referencia la variable fd.

rexkogitans
fuente