Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-devel / 2008-05

How to use fpFlock?

5 messages · 2 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

amir

Hi,

I have many process wanting to write in a file. Each process is going to open the file as a writeonly (using Assignfile and rewrite or fpOpen with o_WrOnly). But there is a risk that two processes simultaneously trying to write a message in the file. I want to use fpflock to avoid this. Is it possible? What I done is something like this:

AssignFile (OutputFile, FileName);
fpflock (OutputFile, LOCK_EX);
Rewrite (OutputFile);
...

The description of fpFlock does not say anything about the default behavior of fpFlock (Is it blocking?). What I saw told me that it is not blocking.

Is it the correct way of using fpFlock?

Reply by email

ik
to amir

flock in Linux (at least) is blocking by default unless passed with specific parameter.

You can try also to create a mutex that only when removed you will access the procedure/function that try to write to the file, and the process that created the mutex is the only one that can write to that file.
You of course remove it when you closed the file.

Just an idea...

Ido

amir wrote 24 lines
Hi, I have many process wanting to write in a file. Each process is going to open the file as a writeonly (using Assignfile and rewrite or fpOpen with o_WrOnly). But there is a risk that two processes simultaneously trying to write a message in the file. I want to use fpflock to avoid this. Is it possible? What I done is something like this: AssignFile (OutputFile, FileName); fpflock (OutputFile, LOCK_EX); Rewrite (OutputFile); ... The description of fpFlock does not say anything about the default behavior of fpFlock (Is it blocking?). What I saw told me that it is not blocking. Is it the correct way of using fpFlock? _______________________________________________ fpc-devel maillist - http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply by email

amir
to ik

So what wrong is with the following code?
When running two instance of this program, *both* print "After Flock" and wait for an input?

uses
  Unix;
var
  InputFile: TextFile;
begin
  AssignFile (InputFile, 'Lock.txt');
  WriteLn ('Before Flock');
  Flush (Output);
  Fpflock (InputFile, LOCK_SH);
  WriteLn ('After Flock');
  Flush (Output);
  Reset (InputFile);
  ReadLn;
  CloseFile (InputFile);
end.
ik wrote 44 lines
flock in Linux (at least) is blocking by default unless passed with specific parameter. You can try also to create a mutex that only when removed you will access the procedure/function that try to write to the file, and the process that created the mutex is the only one that can write to that file. You of course remove it when you closed the file. Just an idea... Ido On Fri, May 2, 2008 at 5:35 AM, amir wrote: > Hi, > > I have many process wanting to write in a file. Each process is going to > open the file as a writeonly (using Assignfile and rewrite or fpOpen with > o_WrOnly). But there is a risk that two processes simultaneously trying to > write a message in the file. I want to use fpflock to avoid this. Is it > possible? What I done is something like this: > > AssignFile (OutputFile, FileName); > fpflock (OutputFile, LOCK_EX); > Rewrite (OutputFile); > ... > > The description of fpFlock does not say anything about the default > behavior of fpFlock (Is it blocking?). What I saw told me that it is not > blocking. > > Is it the correct way of using fpFlock? > > > _______________________________________________ > fpc-devel maillist - > http://lists.freepascal.org/mailman/listinfo/fpc-devel > >

Reply by email

ik
to amir

You should use LOCK_EX instead (exclusive lock rather then shared lock).

From the man file (man 2 flock):

LOCK_SH Place a shared lock. More than one process may hold a shared lock for a given file at a given time.

LOCK_EX Place an exclusive lock. Only one process may hold an exclusive lock for a given file at a given time.

LOCK_UN Remove an existing lock held by this process.

Ido

amir wrote 83 lines
So what wrong is with the following code? When running two instance of this program, *both* print "After Flock" and wait for an input? uses Unix; var InputFile: TextFile; begin AssignFile (InputFile, 'Lock.txt'); WriteLn ('Before Flock'); Flush (Output); Fpflock (InputFile, LOCK_SH); WriteLn ('After Flock'); Flush (Output); Reset (InputFile); ReadLn; CloseFile (InputFile); end. ik wrote: > flock in Linux (at least) is blocking by default unless passed with > specific parameter. > > You can try also to create a mutex that only when removed you will > access the procedure/function that try to write to the file, and the > process that created the mutex is the only one that can write to that > file. > You of course remove it when you closed the file. > > Just an idea... > > Ido > > On Fri, May 2, 2008 at 5:35 AM, amir wrote: > > > > Hi, > > > > I have many process wanting to write in a file. Each process is going to > > open the file as a writeonly (using Assignfile and rewrite or fpOpen with > > o_WrOnly). But there is a risk that two processes simultaneously trying to > > write a message in the file. I want to use fpflock to avoid this. Is it > > possible? What I done is something like this: > > > > AssignFile (OutputFile, FileName); > > fpflock (OutputFile, LOCK_EX); > > Rewrite (OutputFile); > > ... > > > > The description of fpFlock does not say anything about the default > > behavior of fpFlock (Is it blocking?). What I saw told me that it is not > > blocking. > > > > Is it the correct way of using fpFlock? > > > > > > _______________________________________________ > > fpc-devel maillist - > > http://lists.freepascal.org/mailman/listinfo/fpc-devel > > > > > > > > > > > _______________________________________________ fpc-devel maillist - http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply by email

amir
to ik

I have tried both of them (LOCK_SH and LOCK_EX). But the result was the same.

ik wrote 110 lines
You should use LOCK_EX instead (exclusive lock rather then shared lock). >From the man file (man 2 flock): LOCK_SH Place a shared lock. More than one process may hold a shared lock for a given file at a given time. LOCK_EX Place an exclusive lock. Only one process may hold an exclusive lock for a given file at a given time. LOCK_UN Remove an existing lock held by this process. Ido On Tue, May 6, 2008 at 9:38 AM, amir wrote: > So what wrong is with the following code? > When running two instance of this program, *both* print "After Flock" and > wait for an input? > > uses > Unix; > var > InputFile: TextFile; > > begin > AssignFile (InputFile, 'Lock.txt'); > WriteLn ('Before Flock'); > Flush (Output); > Fpflock (InputFile, LOCK_SH); > WriteLn ('After Flock'); > Flush (Output); > > Reset (InputFile); > ReadLn; > > CloseFile (InputFile); > > end. > > > > ik wrote: > > >> flock in Linux (at least) is blocking by default unless passed with >> specific parameter. >> >> You can try also to create a mutex that only when removed you will >> access the procedure/function that try to write to the file, and the >> process that created the mutex is the only one that can write to that >> file. >> You of course remove it when you closed the file. >> >> Just an idea... >> >> Ido >> >> On Fri, May 2, 2008 at 5:35 AM, amir wrote: >> >> >> >>> Hi, >>> >>> I have many process wanting to write in a file. Each process is going >>> > to > >>> open the file as a writeonly (using Assignfile and rewrite or fpOpen >>> > with > >>> o_WrOnly). But there is a risk that two processes simultaneously trying >>> > to > >>> write a message in the file. I want to use fpflock to avoid this. Is it >>> possible? What I done is something like this: >>> >>> AssignFile (OutputFile, FileName); >>> fpflock (OutputFile, LOCK_EX); >>> Rewrite (OutputFile); >>> ... >>> >>> The description of fpFlock does not say anything about the default >>> behavior of fpFlock (Is it blocking?). What I saw told me that it is not >>> blocking. >>> >>> Is it the correct way of using fpFlock? >>> >>> >>> _______________________________________________ >>> fpc-devel maillist - >>> http://lists.freepascal.org/mailman/listinfo/fpc-devel >>> >>> >>> >>> >> >> >> >> > _______________________________________________ > fpc-devel maillist - > http://lists.freepascal.org/mailman/listinfo/fpc-devel > >

Reply by email