为什么为我的服务创build的文件设置(有时)只读属性?

注:这是一个完整的重写这个问题。 我之前将我遇到的问题与一些ACL问题混为一谈,这可能是为什么没有答案。

我有一个Windows服务使用标准的打开/closures/写入例程来写一个日志文件(它从pipe道读东西,并将其填入日志)。 每天午夜打开一个新的日志文件。 该系统是Windows XP Embedded。

该服务作为本地系统服务(用户的NULL为CreateService)运行。

当服务最初启动时,它会创build一个日志文件并写入它没有问题。 在这一点上一切正常,你可以重新启动服务(或电脑)没有问题。

但是,在午夜(当天发生变化时),该服务会创build一个新的日志文件并写入该日志文件。 有趣的是,这个新的日志文件设置了“只读”标志。 这是一个问题,因为如果服务(或计算机)重新启动,服务不能再打开文件进行写入。

以下是系统中已发生问题的相关信息:

Directory of C:\bbbaudit 09/16/2009 12:00 AM <DIR> . 09/16/2009 12:00 AM <DIR> .. 09/16/2009 12:00 AM 437 AU090915.ADX 09/16/2009 12:00 AM 62 AU090916.ADX attrib c:\bbbaudit\* AC:\bbbaudit\AU090915.ADX <-- old log file (before midnight) ARC:\bbbaudit\AU090916.ADX <-- new log file (after midnight) cacls output: C:\ BUILTIN\Administrators:(OI)(CI)F NT AUTHORITY\SYSTEM:(OI)(CI)F CREATOR OWNER:(OI)(CI)(IO)F BUILTIN\Users:(OI)(CI)R BUILTIN\Users:(CI)(special access:) FILE_APPEND_DATA BUILTIN\Users:(CI)(IO)(special access:) FILE_WRITE_DATA Everyone:RC:\bbbaudit BUILTIN\Administrators:(OI)(CI)F NT AUTHORITY\SYSTEM:(OI)(CI)F CFN3\Administrator:F CREATOR OWNER:(OI)(CI)(IO)F 

以下是我用来打开/创build日志文件的代码:

 static int open_or_create_file(char *fname, bool &alreadyExists) { int fdes; // try to create new file, fail if it already exists alreadyExists = false; fdes = open(fname, O_WRONLY | O_APPEND | O_CREAT | O_EXCL); if (fdes < 0) { // try to open existing, don't create new file alreadyExists = true; fdes = open(fname, O_WRONLY | O_APPEND); } return fdes; } 

我很难搞清楚这个文件是如何获得只读标志的。 任何人都可以给我一个线索或方向,我会非常感激。

编译器是VC 6(是的,我知道,它已经过时了,并不好笑,直到你意识到我们刚刚从NT 3.51升级到XPE)。

open()的Microsoft实现有一个可选的第三个参数'pmode',当第二个参数'oflag'包含O_CREAT标志时,它必须存在。 pmode参数指定文件权限设置,这是第一次关闭新文件时设置的。 通常你会通过S_IREAD | 为pmode S_IWRITE,导致一个普通的读/写文件。

在你的情况下,你已经指定了O_CREAT,但省略了第三个参数,所以open()已经使用了第三个参数位置堆栈上的值。 S_IWRITE的值是0x0080,所以如果第三个参数位置的值碰巧有第7位清除,它将产生一个只读文件。 事实上,你只有一些时间只读文件,与第三个参数传递的堆栈垃圾一致。

下面是open()的Visual Studio 2010文档的链接。 自VC 6以来,函数行为的这个方面没有改变。

http://msdn.microsoft.com/en-us/library/z0kc8e3z.aspx

那么在这种情况下,我不知道底层的问题是“开放”的API。 为了“解决”问题,我最终转而使用Win32 API进行文件管理(CreateFile,WriteFile,CloseHandle)。