Cita:
Iniciado por vangodp 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;
}