Archivo

Entradas Etiquetadas ‘stdin’

Control-D para terminar la entrada estándar (EOF stdin)

Viernes, 16 de Abril de 2010 Gaspar Fernández Sin comentarios

A veces, con muchos comandos, por ejemplo sort, tail, cat, read, o muchos otros programas que leen datos de un fichero que luego procesan, tenemos la necesidad de utilizarlos con la entrada estándar del sistema, ya sea para hacer una prueba rápida, evitar tener que escribir un fichero o cualquier otra cosa.

Pero podemos estar introduciendo texto para esos comandos de forma indefinida:

$sort
estrella
mar
troglodita
alienígena
carpa
kiosko
gatillo

¿La forma de dejar de introducir texto? Control-D es un EOF de la stdin para el comando en cuestión que estemos ejecutando.

Eso sí, Control-D, también vale para cerrar la sesión, y si nos aficionamos mucho a utilizarlo, tal vez nos llevemos algún disgusto si la pulsamos cuando no debemos. Para ello podemos escribir en el terminal:

$ set -o ignoreeof

Así cuando pulsemos Control-D a destiempo nos dirá que para cerrar el shell escribamos exit.
Por supuesto esta línea anteriormente descrita podemos escribirla en ~/.bashrc y no tendremos que escribirla más.

Categories: Linux Tags: , , , , , ,

Ejecutar una orden externa redirigiendo STDIN [C]

Jueves, 15 de Abril de 2010 Gaspar Fernández Sin comentarios

Cuando lo hacemos desde la línea de comando, es muy fácil:

echo -e “david\njose\nalfredo\nzacarias\npatrick\ngaspar” | sort

Pero a la hora de querer hacer un programa que ejecute la orden sort, pasándole una serie de líneas no es tan intuitivo.

Para ello, he construido una tubería, y para ello hacemos que el descriptor STDIN_FILENO sea input[0] es decir, el descriptor de lectura de la pipe (con dup2).
Luego pasamos las líneas que necesitemos a la pipe a través del descriptor input[1] y lo cerramos para dar por finalizada la entrada de datos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <unistd.h>
#include <errno.h>
#include <stdio.h>

int main()
{
  int input[2];

  pipe(input);
  dup2(input[0], STDIN_FILENO);
  write(input[1], "david\njose\nalfredo\nzacarias\npatrick\ngaspar", 43);
  close(input[1]);
  execlp("sort", NULL);
  printf("ERROR : %s", strerror(errno));
}

Notas: El código fue creado rápidamente, por ello en el write, encontramos un 43 (la longitud de la cadena).

Los nombres han sido inventados, menos los dos últimos, yo soy Gaspar y Patrick es la persona a la que agradezco parte del mérito de que este fragmento de código esté hoy aquí.

Visita otras webs de la red