2013-02-12 50 views
0

我正在编写Linux ANSI C cgi-bin服务器程序,并同时访问文件。Linux ANSI C同时访问文件和锁定

  1. 是否可以区分文件存在和文件锁定? 我找不到Google的答案。 我想写一个程序,试图打开文件几秒钟,如果fd (认为该文件被锁定了一段时间)。 但是如果文件不存在,它也是fd < 0.所以程序会浪费时间等待。

  2. 假设有几个线程尝试附加到同一个文件而没有锁定。 一个试图添加“AAAA”,另一个 - “BBBB”。 结果文件可以像“AABBAABB”吗? 或者它会一直像AAAABBBB或BBBBAAAA? 或者结果不可预测?

+1

你可能想看看flock(),http://linux.die.net/man/2/flock – Gene 2013-02-12 03:01:03

+0

不幸的是,没有答案来区分锁定而不是存在。 NFS在NFS文件系统上不起作用。我不知道我的服务器上有哪个文件系统。 – nms 2013-02-12 03:27:23

+0

其他的东西也可能无法在NFS上工作,如ACL。如果你有NFS,你应该考虑除了强制锁以外的东西,锁文件就是一个例子。由于您正在使用线程,因此必须使用pthread barrier或条件变量的互斥来控制并发性。任何这些也可以锁定文件。不要考虑使用NFS的群集或ioctl,因为它不能保证工作。 statvfs系统调用告诉你文件系统类型。 – 2013-02-12 04:21:51

回答

0

我假设IEEE标准1003.1-2001可能会推迟到ISO C标准...

万一失败的fopen即FD < 0,则系统会将一些错误代码...... 可以检查这些错误代码。如果文件不存在,则返回的错误将为

ENOENT 文件名的一个组件不会命名现有文件或文件名是空字符串。

更多参考,请访问: http://pubs.opengroup.org/onlinepubs/009695399/functions/fopen.html

对于点2:我已经被超过100个进程同时写入到单个文件做一些数据的记录在我的系统,但从未见过的记录合并(文件总是以附加模式打开)。即它总是像AAAABBBB

+0

好的。谢谢。看起来ENOENT可以帮助找出文件是否被锁定或不存在。如果append能够正常工作,那么锁定文件以追加没有意义。 – nms 2013-02-12 13:18:35