Foros del Web » Programación para mayores de 30 ;) » C/C++ »

como se abre un fichero en modo lectura bloqueante??

Estas en el tema de como se abre un fichero en modo lectura bloqueante?? en el foro de C/C++ en Foros del Web. Hola a todos. Tengo el siguiente problema: Existe alguna manera de abrir un fichero en modo lectura bloqueante en c++?? Lo que quiero es que ...
  #1 (permalink)  
Antiguo 30/11/2007, 11:52
 
Fecha de Ingreso: marzo-2004
Mensajes: 550
Antigüedad: 20 años, 2 meses
Puntos: 7
Sonrisa como se abre un fichero en modo lectura bloqueante??

Hola a todos. Tengo el siguiente problema:

Existe alguna manera de abrir un fichero en modo lectura bloqueante en c++??

Lo que quiero es que no pueda haber dos procesos leyendo a la vez del mismo fichero.

Es que leyendo por internet sólo he encontrado estos modos:

w crea un fichero de escritura. Si ya existe lo crea de nuevo.
w+ crea un fichero de lectura y escritura. Si ya existe lo crea de nuevo.
a abre o crea un fichero para añadir datos al final del mismo.
a+ abre o crea un fichero para leer y añadir datos al final del mismo.
r abre un fichero de lectura.
r+ abre un fichero de lectura y escritura.



Saludos.
  #2 (permalink)  
Antiguo 30/11/2007, 18:36
 
Fecha de Ingreso: noviembre-2007
Mensajes: 37
Antigüedad: 16 años, 6 meses
Puntos: 0
Re: como se abre un fichero en modo lectura bloqueante??

Olas man.....

La verdad es que para leer un archivo es recomendable usar r para leer el archivo; porque el usar r+ puede traer ciertos problemas.....Prueba kon los dos y a ver kual te parece mejor!!!

En todo caso haz esto:

struct libros
{
char nombre[3];
}
libros L; //VARIABLE GLOBAL
FILE *F; //VARIABLE GLOBALÇ

//PROCEDIMIENTOS PARA INGRESA DE DATOS
//PROCEDIMIENTO PARA LECTURA

F=fopen("c:libros.txt",r);
fread(&L,sizeof(L),1,F);
while(!feof(F))
{
if(!feof(F))
{
cout<<L.nombre; //se muestran en pantalla el campo que deseas
fread(&L,sizeof(L),1,F);
}
}

Espero habete ayudado!!!
ALAMOX!!!
  #3 (permalink)  
Antiguo 30/11/2007, 18:49
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Re: como se abre un fichero en modo lectura bloqueante??

Cualquier metodo (como los que describis) en el cual no uses especificamente un modificador para compartir la lectura, escritura o borrado es "bloqueante".
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #4 (permalink)  
Antiguo 01/12/2007, 05:49
 
Fecha de Ingreso: marzo-2004
Mensajes: 550
Antigüedad: 20 años, 2 meses
Puntos: 7
Re: como se abre un fichero en modo lectura bloqueante??

Hola a todos. Gracias por responderme pero no me sirven esas formas de apertura.

Os cuento:

Yo lo que quiero es que solo un proceso pueda abrir un fichero y hasta que no termine de trabajar con é cualquier intento de otro proceso por abrirlo para lectura le dé un error.

Abriendolo en modo "r" pueden leer dos procesos a la vez el contenido del fichero ya que lo acabo de probar.

Seguramente no me he explicado muy bien al principio.

Existe alguna manera de apetura bloqueante de un fichero en C++ ??


Saludos.
  #5 (permalink)  
Antiguo 01/12/2007, 06:44
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Re: como se abre un fichero en modo lectura bloqueante??

Cita:
Iniciado por aeb_asturias Ver Mensaje
Seguramente no me he explicado muy bien al principio.
Te explicaste bien pero al parecer me traiciono la memoria y veo que es todo lo contrario de lo que dije.

Cita:
Iniciado por aeb_asturias Ver Mensaje
Existe alguna manera de apetura bloqueante de un fichero en C++ ??
No que yo sepa, en Windows podes usar CreateFile y LockFile y en UNIX lockf y fcntl.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #6 (permalink)  
Antiguo 01/12/2007, 10:33
 
Fecha de Ingreso: marzo-2004
Mensajes: 550
Antigüedad: 20 años, 2 meses
Puntos: 7
Re: como se abre un fichero en modo lectura bloqueante??

Muchas gracias de nuevo por responder jeje.

El problema de utilizar esas llamadas bloqueantes es que si el proceso que la llama luego por lo que sea finaliza de forma incorrecta o lo "mata" alguién se supone que el fichero seguiría bloqueado indefinidamente no???

La verdad que la cosa es un poco complicada.

El motivo de porqué quiero realizar estos bloqueos es lo siguiente:

La idea es evitar que un programa implementado por mi en C++ se pueda estar ejecutando dos o mas veces simultaneamente. Solo debe ejecutarse uno en cada momento y una vez que termine ya se permite a otro proceso igual ser ejecutado. Como este proceso se lanza muchas veces en el tiempo, hay que evitar que si ya existe uno en ejecución este otro se llegue a lanzar.

Así que para controlar eso la idea era "jugar" con un fichero para sincronizar todos los procesos. En dicho fichero iba a estar almacenado el PID del proceso que en ese momento se estaría ejecutando.

Para ello, lo primero que haría este proceso es comprobar si existe dicho fichero. Si no es asi indicaría que no hay ningún otro proceso igual ejecutandose y por tanto crearía el fichero y añadiría en él su PID y comenzaría su trabajo.

Entonces, en caso de llegar otro proceso igual, primeramente comprobaría si existe dicho fichero. Si es así es posible que se esté ejecutando un proceso igual que se lanzó con anterioridad por lo que comprueba leyendo el PID almacenado en el fichero si ese proceso se esta ejecutando todavía. Si la respuesta es que SI pues entonces finaliza este segundo proceso. Si es que No, entonces seguramente debió de terminar de forma incorrecta el primer proceso o alguien lo debió "matar" y entonces este segundo proceso sustituirá el PID viejo del fichero por el propio suyo.


La cosa era utilizar un fichero para controlar que no se ejecuten a la vez mas de un proceso igual.

La pega está en que si dos procesos leen a la vez el PID que almacena el fichero y resulta que ese PID ya no existe (el proceso con ese PID finalizó ya) entonces los dos escribirán a la vez su PID y se ejecutarán. Y eso es lo que no quiero que ocurra.

Se trata de un problema de concurrencia un pelín complicado para mi.

No se me ocurre ninguna estrategia buena para solucionarlo.

No se que pensais vosotros....

Última edición por aeb_asturias; 01/12/2007 a las 10:39
  #7 (permalink)  
Antiguo 01/12/2007, 11:22
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Re: como se abre un fichero en modo lectura bloqueante??

Cita:
Iniciado por aeb_asturias Ver Mensaje
Muchas gracias de nuevo por responder jeje.

El problema de utilizar esas llamadas bloqueantes es que si el proceso que la llama luego por lo que sea finaliza de forma incorrecta o lo "mata" alguién se supone que el fichero seguiría bloqueado indefinidamente no???
Con CreateFile no tendrias ese problema pero igualmente me parece una solucion ineficiente.

En Windows podes usar un mutex con nombre, al arrancar el programa si lo puede crear es que no hay una instancia anterior, de otra manera se cierra (segun recuerdo podes usar un semaforo en UNIX para el mismo proposito).
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #8 (permalink)  
Antiguo 01/12/2007, 11:43
 
Fecha de Ingreso: marzo-2004
Mensajes: 550
Antigüedad: 20 años, 2 meses
Puntos: 7
Re: como se abre un fichero en modo lectura bloqueante??

Buenas de nuevo. Ya me da verguenza seguir preguntado jeje.......

No puedo utilizar semaforos ni mutex porque date cuenta que estos procesos no comparten nada.....simplemente hay un programa que los va lanzando y ellos mismos son los que tienen que verificar que no hay uno previo ya ejecutandose para seguir hacia adelante.

Los mutex y semaforos están bien cuando el código es compartido y entonces es un medio bueno de sincronización. Pero en mi caso el programa que los lanza se encuentra en una máquina y los procesos son ejecutados en otra máquina diferente por lo que el programa que los lanza no sabe si hay algun recolector ya ejecutandose en la otra máquina. Él simplementa los lanza en determinados momentos y son los propios procesos los que tienen que verificar antes que nada que no existe ya uno anterior en ejecución para poder seguir hacia adelante.

La cuestión es que no se como puedo llegar a hacer eso.


De nuevo muchas gracias por el interes que estás mostrando en intentar solucionar mi problema
  #9 (permalink)  
Antiguo 01/12/2007, 11:54
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Re: como se abre un fichero en modo lectura bloqueante??

Cita:
Iniciado por aeb_asturias Ver Mensaje
No puedo utilizar semaforos ni mutex porque date cuenta que estos procesos no comparten nada.....simplemente hay un programa que los va lanzando y ellos mismos son los que tienen que verificar que no hay uno previo ya ejecutandose para seguir hacia adelante.
Hasta ahi no habria ningun problema en hacerlo, si pueden comprobar un archivo, pueden comprobar otra cosa.

Cita:
Iniciado por aeb_asturias Ver Mensaje
Los mutex y semaforos están bien cuando el código es compartido y entonces es un medio bueno de sincronización. Pero en mi caso el programa que los lanza se encuentra en una máquina y los procesos son ejecutados en otra máquina diferente por lo que el programa que los lanza no sabe si hay algun recolector ya ejecutandose en la otra máquina. Él simplementa los lanza en determinados momentos y son los propios procesos los que tienen que verificar antes que nada que no existe ya uno anterior en ejecución para poder seguir hacia adelante.
¿Un solo programa (muchos procesos despues) es el que se ejecuta en esa maquina diferente? Si es asi no tiene importancia quien lo ejecuta y podes usar un mutex perfectamente. A menos claro que vos estes ejecutando un programa que no sea tuyo ... sino en tu programa comprobas al inicio y ya esta.

Aclaro que en Windows un mutex con nombre es global (o cuanto menos de la sesion), por lo tanto al inicio de tu programa intentas crearlo y si podes es que no hay ninguna instancia en ejecucion, sino podes (te devuelve ERROR_ALREADY_EXISTS) es que si la hay, cerras y listo.

Segun lo que puedo leer un semaforo es lo que necesitas en UNIX y podes usarlo con ftok, semget, etc.
Sino la manera mas simple que tienen es usar open con O_CREAT | O_EXCL. Es una operacion atomica y cuando falla quiere decir que ya hay un proceso en ejecucion, al terminar este proceso tiene que borrar el archivo.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO

Última edición por Eternal Idol; 01/12/2007 a las 12:17
  #10 (permalink)  
Antiguo 02/12/2007, 01:01
 
Fecha de Ingreso: diciembre-2006
Mensajes: 25
Antigüedad: 17 años, 5 meses
Puntos: 0
Re: como se abre un fichero en modo lectura bloqueante??

hola, yo tengo un problema con mi programa, tengo en mi menu de opciones las clasicas bajas y modificaciones........y pues en las dos no me funcionan, creo que es por lo mismo, pero no se que seria.....
pues en bajas, se supone que tengo que abrir otro archivo temporal, donde se copiaran todos los datos que no quiera borrar...y despues borro el original y abro otro,, donde se volveran a copiar los datos que estan en temporal y asi ya quedaria borrado lo que deseo

el codigo esta algo asi..

temp=fopen("temp.dat","wb");
if(archivo==NULL)
{printw("error al abrir el archivo temp")
exit(1)
}
archivo=fopen("carros.dat","rb");
if(archivo==NULL)
{printw("error al abrir el archivo carros"
exit(1)
}

while(fread(&car,sizeof(car),1,archivo)) //aqui es donde posiblemente me equivoque//
{if(car.dat.noid!=nc)
{fwrite(&car,sizeof(car),1,temp)
}
}
  #11 (permalink)  
Antiguo 02/12/2007, 04:09
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Re: como se abre un fichero en modo lectura bloqueante??

Cita:
Iniciado por fernandoBH Ver Mensaje
hola, yo tengo un problema con mi programa,
Me parece que deberias crear un hilo para tratar tu problema. Desde el vamos te digo que la manera mas simpel de encontrar y resolver un problema es depurando tu programa.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:52.