[Mono-list] Does FileMode.Append have O_APPEND semantics on Unix?

Jaroslaw Kowalski jaak at jkowalski.net
Wed May 3 02:43:18 EDT 2006


Hi guys!

When developing NLog (http://www.nlog-project.org) I faced an interesting 
problem: how to enable multiple process to append to log files in a 
synchronized manner.

Here are my thoughts:

1. You can achieve best performance if you keep the files open. That implies 
FileShare.Write when creating/opening them.

2. FileMode.Append is broken on Windows, since it only moves the file 
pointer once, after the file has been opened/created. This leads to race 
conditions when multiple processes want to append to the same file without 
synchronization. You get garbage in files.

What I wanted to achieve is something similar to the semantics of O_APPEND 
flag passed to open() function, where all append operations are atomic 
(http://theory.uwinnipeg.ca/gnu/glibc/libc_144.html)

On Windows I came up with the solution that uses global named mutexes to 
synchronize seek-and-write operation. It would be great if I could use 
native Unix support for appending files while running on this platform.

My question is: is FileMode.Append supposed to have O_APPEND semantics on 
Unix? If not, what's the best way to open file with this append semantics in 
mono? I've seen you have MonoIO class, but I'm not sure how it can be used. 
Do you have any ideas?

--
Jarek
http://blog.jkowalski.net/



More information about the Mono-list mailing list