problema con cerrojo de escritura
Publicado por ruben (4 intervenciones) el 16/12/2007 21:55:12
Hola me estoy volviendo loco para escribir un programa que establezca un simple cerrojo de escritura sobre un fichero. Lo que hecho hasta ahora es esto:
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
main(void)
{
int fd;
creat("fichprueba",0777);
fd=open("fichprueba",O_WRONLY,0777);
//datos para escribir en el fichero para ver si el cerrojo funciona
char buffer[] = { 'x' , 'y' , 'z' };
struct flock ce;
ce.l_type=F_WRLCK;
ce.l_whence=SEEK_SET;
ce.l_start=0;
ce.l_len=0;
fcntl(fd,F_SETLK,&ce)==-1?printf("error en el bloqueo "):printf("todo bien(se ha bloqueado) ");
write (fd,buffer,sizeof(buffer))==-1?printf("no se pudo escribir "):printf("se ha escrito ");
close (fd);
}
Cuando lo ejecuto me dice que el fichero ha sido bloqueado, pero tambien que se ha escrito en el fichero, y de hecho eso es lo que sucede.
Antes, en vez de open y write usaba fopen y fwrite, pero tuve que cambiarlo porque de ese modo no conseguia obtener un descriptor de fichero del tipo adecuado (int) para pasarle a fcntl como primer argumento. ¿Alguien sabe que es lo que estoy haciendo ahora mal?
Gracias.
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
main(void)
{
int fd;
creat("fichprueba",0777);
fd=open("fichprueba",O_WRONLY,0777);
//datos para escribir en el fichero para ver si el cerrojo funciona
char buffer[] = { 'x' , 'y' , 'z' };
struct flock ce;
ce.l_type=F_WRLCK;
ce.l_whence=SEEK_SET;
ce.l_start=0;
ce.l_len=0;
fcntl(fd,F_SETLK,&ce)==-1?printf("error en el bloqueo "):printf("todo bien(se ha bloqueado) ");
write (fd,buffer,sizeof(buffer))==-1?printf("no se pudo escribir "):printf("se ha escrito ");
close (fd);
}
Cuando lo ejecuto me dice que el fichero ha sido bloqueado, pero tambien que se ha escrito en el fichero, y de hecho eso es lo que sucede.
Antes, en vez de open y write usaba fopen y fwrite, pero tuve que cambiarlo porque de ese modo no conseguia obtener un descriptor de fichero del tipo adecuado (int) para pasarle a fcntl como primer argumento. ¿Alguien sabe que es lo que estoy haciendo ahora mal?
Gracias.
Valora esta pregunta


0