[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