Programación General > C/C++

 Lenguaje C: problemilla con dup2()

(1/1)

zany_666:
Hola, de nuevo os pregunto sobre C, estoy dándole muchas vueltas y no comprendo porque puede ser el error.
Para mi programa estoy usando dup2() de esta forma, comprobando todos los errores que me puedan dar las llamadas al sistema:


--- Código: C ---fdIn=open(lectura,O_RDONLY);        //Abro el fichero de lecturavalorIn=dup2(fdIn,0);                           //Cierra entrada estándar y duplicacloseIn=close(fdIn);fdOut=open(escritura,O_CREAT,0700); //Abro el archivo de salidavalorOut=dup2(fdOut,1);                       //Cierra salida estándar y duplicacloseOut=close(fdOut);execvp(aux[0],aux);                             //esto ejecuta un comando sin argumentos, por ejemplo un wc o un headexit(EXIT_FAILURE); 
Lo que quiero hacer es abrir el fichero "lectura", que es un fichero que contiene texto y abrir, o crear en caso de que no exista, el ficero "escritura", al ejecutar el exec() quiero que "lectura" sustituya a la entrada estandar, y la salida estandar sea sustituida por "escritura", es decir, no escribo nada por teclado ni aparece nada en pantalla, por ejemplo, si el comando a ejecutar es un wc, en mi fichero "escritura" debería aparecer un número (resultado de haber contado palabras de "lectura")

Lo que me ocurre es que el segundo dup2 me da un error y no pasa de esa línea, ni siquiera devuelve un valor de error, lo que me aparece es esto al ejecutar:


--- Código: Text ---wc: error de escritura: Descriptor de archivo inválido 
No veo el error con el descriptor de fichero, duplico y cierro la salida estándar, para que me escriba en "escritura" y no por pantalla, alguien me puede ayudar? Espero haberme explicado bien.

Gracias adelantadas y por haberse leído este tochazo jeje.  :hola:

zany_666:
Lo he solucionado, el error me daba en el dup de alguna forma, pero lo he arreglado de esta manera:


--- Código: C ---      fdIn=open(argv.fIn,O_RDONLY);        dup2(fdIn,0);        close(fdIn);                fdOut=open(argv.fOut,O_CREAT,0700);        close(fdOut);        fdOut=open(argv.fOut,O_RDWR);        dup2(fdOut,1);        close(fdOut); 
Sigo sin comprender porque con el primer open() no funciona y tengo que cerrar el descriptor y hacer un segundo open(), hay alguna forma más "elegante" de hacerlo, sin tener que hacer 2 open()?

zany_666:
Me respondo, la solución está en:


--- Código: C ---fdOut=open("escritura",O_WRONLY | O_TRUNC | O_CREAT,0700); 
No da problemas  ^_^

Navegación

[0] Índice de Mensajes

Ir a la versión completa