SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: zany_666 en Sábado 17 de Abril de 2010, 22:09

Título: Lenguaje C: problemilla con dup2()
Publicado por: zany_666 en Sábado 17 de Abril de 2010, 22:09
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
  1. fdIn=open(lectura,O_RDONLY);        //Abro el fichero de lectura
  2. valorIn=dup2(fdIn,0);                           //Cierra entrada estándar y duplica
  3. closeIn=close(fdIn);
  4. fdOut=open(escritura,O_CREAT,0700); //Abro el archivo de salida
  5. valorOut=dup2(fdOut,1);                       //Cierra salida estándar y duplica
  6. closeOut=close(fdOut);
  7. execvp(aux[0],aux);                             //esto ejecuta un comando sin argumentos, por ejemplo un wc o un head
  8. exit(EXIT_FAILURE);
  9.  

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
  1. wc: error de escritura: Descriptor de archivo inválido
  2.  

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:
Título: Re: Lenguaje C: problemilla con dup2()
Publicado por: zany_666 en Domingo 18 de Abril de 2010, 15:04
Lo he solucionado, el error me daba en el dup de alguna forma, pero lo he arreglado de esta manera:

Código: C
  1.       fdIn=open(argv.fIn,O_RDONLY);
  2.         dup2(fdIn,0);
  3.         close(fdIn);        
  4.         fdOut=open(argv.fOut,O_CREAT,0700);
  5.         close(fdOut);
  6.         fdOut=open(argv.fOut,O_RDWR);
  7.         dup2(fdOut,1);
  8.         close(fdOut);
  9.  

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()?
Título: Re: Lenguaje C: problemilla con dup2()
Publicado por: zany_666 en Domingo 18 de Abril de 2010, 20:27
Me respondo, la solución está en:

Código: C
  1. fdOut=open("escritura",O_WRONLY | O_TRUNC | O_CREAT,0700);
  2.  

No da problemas  ^_^