[C con Clase] duda con write

Pogui poguijuaz en gmail.com
Mar Jun 10 03:04:11 CEST 2008


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.
>  
>   
Claro, el codigo 141 para pasarlo a errno hay que restarle 128 => 
141-128=13 "permiso denegado"
Voy a intentar hacer lo que sugeriste, gracias.
Cualquier cosa te digo.
salu2




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