[C con Clase] duda con write

xinul.vbp xinul.vbp en gmail.com
Mar Jun 10 04:03:49 CEST 2008


On Mon, Jun 09, 2008 at 10:04: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.
> >  
> >   
> 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.

ok, en el mail anterior te iba a poner un ejemplo básico de uso de tuberías sin nombre,
ya que creo que el error esta en que no implementas bien las pipes, por como viene la
función saco esta deducción acá va un ejemplo básico tal ves te sirva para aclarar dudas:


#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SIZE 512

int main(int argc, char **argv) {

        pid_t pid;
        int p[2], readbytes;
        char buffer[SIZE];

        pipe( p );

        if((pid=fork()) == 0) { 
                /* hijo */
                close(p[1]); /* cerramos el lado de escritura del pipe */
                while((readbytes = read(p[0], buffer, SIZE )) > 0)
                        write(1, buffer, readbytes);
                close( p[0] );
        }
        else {
                /* padre */
                close(p[0]); /* cerramos el lado de lectura del pipe */
                strcpy( buffer, "Esto llega a traves de la tuberia\n" );
                write(p[1], buffer, strlen( buffer ));
                close(p[1]);
        }
        waitpid( pid, NULL, 0 );

        return 0;
}

espero que esto te sirva por si tenias dudas sobre la implementación de tuberías.


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

Solo el conocimiento te hace libre.




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