buenas gente, a ver si alguno me puede ayudar con este problema.
La idea es que tengo un proceso lector y uno escritor que se comunican
mediante un FIFO. El proceso lector crea el FIFO y el escritor le manda
3 mensajes.Despues el escritor cierra su fd y cuando el lector obtiene
un 0 como resultado del read cierra el suyo y elimina el FIFO.
El asunto es que el lector me recibie mal los mensajes si el escritor le
manda el \0 del final y no entiendo por que.
No se si ayuda pero,un dato curioso es qeu dependiendo de que tamaño
tenga el buffer de lectura (que determina en cuantas leidas recibo una
cadena) recibo distintos mensajes.
Si hago al escritor que no mande el \0 del final anda todo ok.
Alguien tiene alguna pista de porque puede ser este comportamiento??
Les mando el codigo por si les sirve para algo:
________________________________________________________________________
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#define CANT_MAX_ESCRITORES 1//10
#define NOMBRE_FIFO "./miPipe"
#include <sys/wait.h>
using namespace std;
int main(int argc, char **argv) {
pid_t nuevoPid = 0;
//se lanzan todos los procesos desde el mismo proceso padre
for (unsigned i = CANT_MAX_ESCRITORES; i-- && ((nuevoPid = fork()) >
0); );
if (nuevoPid == -1){perror("No se pudo crear proceso\n");exit(1);}
if (nuevoPid == 0)
{//proceso hijo, escritor
int fd;
/* Si la tubería no existe cuando el proceso escritor intenta
abrirla,
* el escritor vuelve a intentarlo cada segundo hasta que pueda
abrirla */
while (((fd = open(NOMBRE_FIFO,O_WRONLY)) == -1) && (errno ==
ENOENT))
sleep(1);
if (fd == -1){perror("No se pudo abrir el FIFO para escritura
\n");exit(1);}
//se escriben los 3 mensajes en el FIFO
const unsigned short tamBufCadena = 50;
char cadena[tamBufCadena];
for (unsigned short nmensaje = 1; nmensaje <= 3;nmensaje++)
{
memset(cadena,0,tamBufCadena);
sprintf( cadena, "Mensaje numero %d pid: %d\n",
nmensaje, getpid() );
size_t count = strlen(cadena);// + 1; <=============
ACA SI AGREGO
EL +1 SE COMPORTA DE LA FORMA "EXTRAÑA" DICHA
size_t escritoTotal;
ssize_t escrito;
escritoTotal = 0;
while ((escritoTotal < count) && ((escrito = write(fd,
((char*)cadena) + escritoTotal,count - escritoTotal)) > 0) )
escritoTotal += escrito;
if (escrito == -1){perror("No se pudo escribir en el
FIFO
\n");exit(1);}
}
if (close(fd) == -1){perror("No se pudo cerrar el FIFO de
escritura
\n");exit(1);}
exit(0);
}
//proceso padre, lector
//se crea el FIFO con permisos los permisos adecuados
if (mknod(NOMBRE_FIFO,S_IFIFO | 0666,0) == -1){perror("No se pudo crear
el FIFO\n");exit(1);}
int fd;
if ((fd = open(NOMBRE_FIFO,O_RDONLY)) == -1){perror("No se pudo abrir
el FIFO para lectura\n");exit(1);}
ssize_t leido;
const unsigned short count = 50; //tamaño del buffer de lectura
char buf[count];
//se lee del FIFO hasta que se cierra (devuelve 0) o hay error
(devuelve -1)
while ((leido = read(fd, buf,count)) > 0)
{
printf("%d: %s\n",getpid(),buf);
memset(buf,0,count);
}
if (leido == -1){perror("No se pudo leer del FIFO\n");exit(1);}
if (close(fd) == -1){perror("No se pudo cerrar el FIFO de lectura
\n");exit(1);}
//se elimina el fifo
if (unlink(NOMBRE_FIFO) == -1){perror("No se pudo eliminar el FIFO
\n");exit(1);}
return 0;
}
________________________________________________________________________
saludos, se agradece cualquier comentario,
_______________________________________________
Lista de correo Programacion.
[email protected]
http://listas.fi.uba.ar/mailman/listinfo/programacion