Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Redireccionar STDIN y STOUT a un script

Estas en el tema de Redireccionar STDIN y STOUT a un script en el foro de C/C++ en Foros del Web. Buenas, estoy trabajando en el lenguaje C y debo hacer una funcion que redireccione tanto entrada como salida a un script, en fin, busque documentacion ...
  #1 (permalink)  
Antiguo 22/04/2015, 19:05
 
Fecha de Ingreso: abril-2015
Mensajes: 13
Antigüedad: 9 años, 7 meses
Puntos: 0
Pregunta Redireccionar STDIN y STOUT a un script

Buenas, estoy trabajando en el lenguaje C y debo hacer una funcion que redireccione tanto entrada como salida a un script, en fin, busque documentacion al respecto acerca de cada uno de estos aspectos( ya que soy novato usando C), pero solamente pude entender los conceptos separádamente, se que Stdin es la entrada por terminal tanto como Stout la salida, se como pasarlos a un script, pero solo dentro de una terminal(de Linux), pero a la hora de pasar a mi IDE de eclipse, nose como relacionar el código de mi .c (lo que seria mi funcion)con lo que se supone que entre o salga dentro de la terminal, alguien que pueda dar una mano con esto?

Gracias.
  #2 (permalink)  
Antiguo 22/04/2015, 20:31
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: Redireccionar STDIN y STOUT a un script

¿Quieres escribir en un fichero es eso?
  #3 (permalink)  
Antiguo 23/04/2015, 06:37
 
Fecha de Ingreso: abril-2015
Mensajes: 13
Antigüedad: 9 años, 7 meses
Puntos: 0
Exacto, esa es mi intencion, guardarlo en un txt
  #4 (permalink)  
Antiguo 23/04/2015, 07:22
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: Redireccionar STDIN y STOUT a un script

Mira... te puedo poner ejemplos pero lo mejor es que te dirijas a esta pagina, lea sus conceptos y después lo preguntas aquí si tienes dudas. Lo digo por que la pagina es bastante completa rica en ejemplos.
http://www.c.conclase.net/ficheros/

La pagina es algo antigua pero aun vale, a mi me servio. En ella te vas encontrar como funcionan los archivos y que funciones se utilizan para esa tarea.

Luego vuelves y preguntas aquí lo que tengas dudas. ¿Que te parece?
  #5 (permalink)  
Antiguo 23/04/2015, 10:06
 
Fecha de Ingreso: abril-2015
Mensajes: 13
Antigüedad: 9 años, 7 meses
Puntos: 0
Respuesta: Redireccionar STDIN y STOUT a un script

Dale buenisimo, la voy a revisar y veo si sale, Gracias.
  #6 (permalink)  
Antiguo 23/04/2015, 12:15
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: Redireccionar STDIN y STOUT a un script

venga... Intenta hacer los ejemplos, más que todo entender como funcionan las funciones que abren, escriben, leen y se mueven por el archivo. No son muchas, ni tampoco son muy complicadas, pero hay que practicar. ;)
Cuando tenga alguna duda aquí estaremos. ;)
  #7 (permalink)  
Antiguo 18/05/2015, 11:37
 
Fecha de Ingreso: abril-2015
Mensajes: 13
Antigüedad: 9 años, 7 meses
Puntos: 0
Respuesta: Redireccionar STDIN y STOUT a un script

Cita:
Iniciado por vangodp Ver Mensaje
venga... Intenta hacer los ejemplos, más que todo entender como funcionan las funciones que abren, escriben, leen y se mueven por el archivo. No son muchas, ni tampoco son muy complicadas, pero hay que practicar. ;)
Cuando tenga alguna duda aquí estaremos. ;)
Hola nuevamente vangodp, finalmente pude solucionar este problemita, pero a la vez tengo otro.

En fin, tengo este codigo que funciona perfectamente y redirecciona mi entrada atraves de un pipe.

Te explico un poco que es lo que hace, se hace un fork generando un proceso hijo y otro padre, el padre lo que debe hacer es leer una partecita de un archivo y pasarsela por pipe al hijo, luego el hijo lo lee.

Se hace la redireccion de la salida para que envez de ser la consola sea el archivoTemporal.(con dup2)

Luego ejecuta el execv, que toma como parametro un programa externo que hace un print del 2do parametro del argv, que es justamente lo que leyo el padre.

Por el dup2, como cambie el descriptor, ahora en vez de aparecer en la pantalla pasa al archivo.txt, ok hasta aqui todo bien, pero aqui viene el problema.

Yo ya tengo la salida de lo que ejecuto el execv en el archivoTemporal, pero lo que quiero ahora es poder aplicar nuevamente el execv pero pasandole como 1er parametro /usr/bin/sort y como 2do el archivo a sortear, y esa salida quiero pasarla a otro archivo(que no sea el temporal)

En fin trate de hacerlo, cerrando el descriptor que use para redireccionar la salida hacia el archivo temporal, y luego volver hacer dup2 para que la salida esta vez seea mi nuevo archivo, donde quiero que esten los datos ordenados.

Esto no funciona, lo que me genera dudas si es que cerre bien el descriptor, si no se puede usar dup2 dos veces sobre la salida, en fin , si me podes dar un poquito de luz con este tema te lo agradeceria, ya ue es lo ultimo que me falta para poder completar mi funcion.

Desde ya gracias

Bueno todo

Código:
int main()
{

	int     fd[2];
	pid_t   childpid;
	char    readbuffer[6];

	pipe(fd);

	if((childpid = fork()) == -1){
	      	perror("error en fork");
	      	exit(1);
	}

	if(childpid == 0){
		// Parent process closes up output side of pipe

		close(fd[1]);

		FILE* fdArch=fopen("archivoTemporal.txt","w");

		char nameBuff[sizeof("/tmp/myTmpFile-XXXXXX")];

		memset(nameBuff,0,sizeof(nameBuff));

		strncpy(nameBuff,"/tmp/myTmpFile-XXXXXX",sizeof("/tmp/myTmpFile-XXXXXX"));

		int fdNewFile=mkstemp(nameBuff);

		dup2(fdNewFile,STDOUT_FILENO);

		// Read in a string from the pipe

		read(fd[0], readbuffer, sizeof(readbuffer));

		char *argv[]={ "/home/utnso/workspace/EjemplosC/Debug/EjemplosC", readbuffer, NULL};

		execv(argv[0],argv);

		close(fdNewFile);

		dup2(fileno(fdArch),STDOUT_FILENO);

		char *argv1[]={"/usr/bin/sort",nameBuff, NULL};

		execv(argv1[0],argv1);

		unlink(nameBuff);

		fclose(fdArch);
	}

	else{

		// Child process closes up input side of pipe
		close(fd[0]);

		FILE* archEntry=fopen("datosDeEntrada.txt","r");

		char string[6];

		fseek(archEntry,4,SEEK_SET);

		fread(string,6,1,archEntry);
		// Send "string" through the output side of pipe

		write(fd[1], string, sizeof(string));

		fclose(archEntry);

		exit(0);

	}

	

	return 0;
}

Etiquetas: funcion, scripts, terminal
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:32.