[C con Clase] duda con write

xinul.vbp xinul.vbp en gmail.com
Mar Jun 10 04:36:07 CEST 2008


On Mon, Jun 09, 2008 at 10:28:11PM -0300, Pogui wrote:
> xinul.vbp escribió:
> > 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.
> >  
> >   
> Me fijé con el codigo que me pasaste, pero write no esta retornando 
> nada, el programa termina antes de terminar la ejecución de write.
> Algo lo está matando repentinamente.
> Estoy sospechando que libc esta mandando un signial term.
> Ya no se que hacer, en teoría debería ser algo simple no?
> salu2

mmm, pues entonces es lo que suponía como me das solo una parte de tu programa,
solo una función, deduzco que el resto de lo que tendrías que hacer lo has echo
y bien, pero al parecer no, si write no llega a terminar y tu programa termina
repentinamente, como write es una llamada del sistema, tu kernel debe estar 
matando a tu programa por alguna razón, la mas lógica es que no has implementado
bien la tubería, osea del otro lado no hay nadie escuchando, cuando pasa esto
se recibe una SIGPIPE (On POSIX-compliant platforms, SIGPIPE is the signal 
thrown when a computer program attempts to write to a pipe without a process 
connected to the other end.), entendido? esto provoca esa terminación abrupta.
cuando esto pasa write tendría que retornar un error code de EPIPE, lo cual 
tendrías que verlo con el código que te puse.
ya te he enviado un ejemplo básico de uso de tuberías sin nombre, allí podrás ver
lo que te faltaba.
otra cosa, tu función llamas a pipe, pero nunca forkeas y en el caso de
que hallas forkeado antes no tienes que llamar mas a pipe.

bueno creo que este es tu problema, ya no quedan otras opciones, la única era que
no estabas implementando bien las tuberías, pero yo supuse que si lo habías echo.

-- 
|_|0|_|
|_|_|0|
|0|0|0|

Solo el conocimiento te hace libre.




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