[C con Clase] duda con write

xinul.vbp xinul.vbp en gmail.com
Mar Jun 10 01:36:57 CEST 2008


On Mon, Jun 09, 2008 at 06:07:03PM -0300, Pogui wrote:
> xinul.vbp escribió:
> > On Mon, Jun 09, 2008 at 12:02:31PM -0300, Pogui wrote:
> >   
> >> Hola lista, tengo un problema que me esta rompiendo la cabeza.
> >> Resulta que al parecer la función write de este ejemplo hace que mi 
> >> programa termine inesperadamente:
> >>
> >> #include <sys/types.h>
> >> #include <sys/stat.h>
> >> #include <sys/wait.h>
> >> #include <fcntl.h>
> >>
> >> #include <stdlib.h>
> >> #include <unistd.h>
> >> #include <stdio.h>
> >> #include <errno.h>
> >> #include <string.h>
> >>
> >> #include "hijos.h"
> >>
> >> int hijo(char* buffer, char caracter)
> >> {
> >>     int *contador,pipea[2],i=0;   
> >>     
> >
> >   
> >>     *contador=0;   
> >>     
> > no se a que le estas asignando ya que no has reservado nada de memoria con malloc
> >
> >
> >   
> >>     while(*buffer) {
> >>         if(*buffer==caracter)
> >>             i++;
> >>         buffer++;
> >>     }
> >>     *contador=i;   
> >>     
> >
> >   
> >>     printf("%d\n%d\n",*contador,i);   
> >>     
> > acá tendrías que recivír un segment fault.
> >
> >   
> >>    
> >>     if(caracter == 'a') {
> >>         printf("es una 'a'\n");           
> >>         if (pipe(pipea) == -1) {
> >>             perror ("pipe");
> >>             exit (EXIT_FAILURE);
> >>         }       
> >>         /*envio de mensaje */                   
> >>         close (pipea[0]);       
> >>     
> >
> >   
> >>         //write (pipea[1], contador, sizeof(contador));    esta es la 
> >> linea del problema
> >>     
> > pues como ya dije a _contador_ no le has asignado nada de memoria
> >
> >   
> >>         printf("luego de escribir\n");           
> >>         close (pipea[1]);                               
> >>         /*fin de envio de mensaje */
> >>     }
> >>    
> >>     return *contador;
> >> }
> >>
> >> lo raro es que compila perfectamente.
> >> Alguna idea de que es lo que puede estar pasando?
> >> Apenas el programa entra al write sobre el pipe, la ajecucuión termina 
> >> abruptamente
> >>     
> > termina con algún error, cual?
> >
> >   
> >> :(
> >> gracias por su atención.
> >>     
> >
> > prueba reservando memoria para _contador_ con malloc.
> >
> >
> >
> >   
> 
> intenté reservando memoria para contador, pelo lo mismo.
> Según lo que encontré el error 141 es error de "permiso denegado"
> No logro entender porque.......
 
pues el error 141 para mi es desconocido, no existe ningún error 141 en sys_errlist
el error Permission denied es el código 13, pero si quieres ver si el error esta en
la llamada a write, entonces hay que ver si write devuelve error, usa esto:

if(write (pipea[1], contador, sizeof(contador)) == -1)
	 fprintf(stderr, "%s %d: %s\n", __FILE__, __LINE__, strerror(errno));

si no te sale ningún error aquí es que write no es el problema.
lo que me extraña es ese código de error, lo que me hace pensar que el problema
debe estar en otro lugar, como no tengo todo el código de tu programa no puedo
decirte si es en otro lugar, pero en el código que nos das, al parecer esta todo
bien salvando lo que ya te dije y también teniendo en cuenta que a esta función 
la llamas luego de hacer fork, sino no hay a quien mandarle no ;)

bueno podrías ver si es o no la llamada write el del problema, con el código que
te puse, cambia tu llamada a write por ese código, y sino seguiremos viendo donde
puede estar el problema.
 
-- 
|_|0|_|
|_|_|0|
|0|0|0|

Solo el conocimiento te hace libre.




Más información sobre la lista de distribución Cconclase