#opens counter data file
open(COUNTERDAT,"./counter.dat");
#locks file, and if can't, goes back to READCOUNTER to try again
flock COUNTERDAT, 1 or next READCOUNTER;
...and later...
#opens counter data file again
open(COUNTERDAT,">./counter.dat");
#locks file, and if can't, goes back to WRITECOUNTER
flock COUNTERDAT, 2 or next WRITECOUNTER;
What happens when
open(COUNTERDAT,">./counter.dat"); runs and then your operating system switches to another process which runs
open(COUNTERDAT,"./counter.dat");
flock COUNTERDAT, 1 or next READCOUNTER;
Answer: The second process now has the file locked but the contents was destroyed with the open from the first process. The second process will see that the count is zero and will write '1' to the file. The solution is to open the file for reading/writing:
open(COUNTERDAT, "<+./counter.dat"); then
seek to the beginning of the file when you want to write the new number (if you were potentially writing a smaller byte count you would want to
truncate the file, but since a number will always be at least as long as the previous number (assuming positives) this is not necessary).
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.