From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=unavailable autolearn_force=no version=3.4.4 X-Received: by 10.182.213.166 with SMTP id nt6mr33321197obc.3.1441116340856; Tue, 01 Sep 2015 07:05:40 -0700 (PDT) X-Received: by 10.182.213.164 with SMTP id nt4mr432048obc.39.1441116340831; Tue, 01 Sep 2015 07:05:40 -0700 (PDT) Path: eternal-september.org!reader01.eternal-september.org!reader02.eternal-september.org!news.eternal-september.org!mx02.eternal-september.org!feeder.eternal-september.org!news.glorb.com!kq10no35682igb.0!news-out.google.com!nt1ni21252igb.0!nntp.google.com!kq10no27408igb.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail Newsgroups: comp.lang.ada Date: Tue, 1 Sep 2015 07:05:40 -0700 (PDT) In-Reply-To: Complaints-To: groups-abuse@google.com Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=178.193.240.199; posting-account=DQbqYQoAAACn8hHn2LmG2aF7Mhbxl_Lf NNTP-Posting-Host: 178.193.240.199 References: User-Agent: G2/1.0 MIME-Version: 1.0 Message-ID: Subject: Re: Exclusive file access From: ahlan@marriott.org Injection-Date: Tue, 01 Sep 2015 14:05:40 +0000 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Xref: news.eternal-september.org comp.lang.ada:27674 Date: 2015-09-01T07:05:40-07:00 List-Id: On Thursday, August 27, 2015 at 3:52:36 PM UTC+2, ah...@marriott.org wrote: > Dear All, >=20 > Obviously I'm misunderstanding something here. >=20 > I thought that if two processes tried to open the same file for write acc= ess then the second process would get an exception. >=20 > I have a simple example which when compiled using GnatPro 7.3.1 and run u= nder 32-bit Windows XP demonstrates that this is not so. >=20 > Which then begs the question on how to detect if the file is in use and a= bort if it is. > This should be simple but obviously too complex for my tiny brain. > Does anyone know how to do this from Ada (without resorting to the OS dir= ectly)? >=20 > My simple test program is >=20 > package body Test is >=20 > package Io renames Ada.Text_IO; >=20 > procedure Work is > The_File : Io.File_Type; > begin > Io.Open (The_File, Io.Out_File, "Test.Txt"); > for Count in Natural'value(Ada.Command_Line.Argument(1)) .. Natural'v= alue(Ada.Command_Line.Argument(2)) loop > Io.Put_Line (The_File, "Count =3D" & Count'img); > Io.Put_Line ("Count =3D" & Count'img); > delay 1.0; > end loop; > Io.Close (The_File); > exception > when others =3D> > Io.Put_Line ("Exception"); > end Work; >=20 > end Test; >=20 > If I execute this from one process with parameters 1 10 and then when it = reaches 8 start the program again from a second process with parameters 3 7= on the same machine, the resultant file is a nice mixture! :-( >=20 > Count =3D 3 > Count =3D 4 > Count =3D 5 > Count =3D 6 > Count =3D 7 > Count =3D 6 > Count =3D 7 > Count =3D 8 > Count =3D 9 > Count =3D 10 >=20 > This is not what I want. I want what the first instance produces and the = second instance to fail. Surely nobody would want otherwise ;-) >=20 > Best wishes, > Ahlan I am not trying to protect the file from other tasks I am trying to protect= the file from other processes - ie other programs or utilities - perhaps e= xecuting on other computers if the file in question is on a network. I want= to open the file in such a way that I am granted exclusive write access. T= his has absolutely nothing to do with tasking or protected objects etc. Bruce B. tells me that there are routines in the package Directories that c= an be used to check if the file is already open. However that wouldn't be a= full solution because there would be nothing to stop any other program fro= m opening the file and messing with it. However it would be a start. If the= file was already opened (by some other process) then I could avoid opening= it. Unfortunately I couldn't find any such routine in Ada.Directories. Am = I going blind? So far the only solution I can see is for me to write my own filing system,= one that has the ability to open the file for exclusive file access. Howev= er I cannot believe that this is what people really do. As it stands if I write a program that writes a log to a text file a second= occurrence of the program if run concurrently will mess up this log. Is there really no way for an Gnat Ada program to open a file for exclusive= access against other processes without resorting to the program writing hi= s/her own filing system? (Open/Read/Write/Close that call directly the OS A= PI)