gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 11:22:43 24 4
gpt4 key购买 nike

注意:这是对这个问题的完全重写。我之前将一些 ACL 问题与我正在寻找的问题混为一谈,这可能就是没有答案的原因。

我有一个 Windows 服务,它使用标准的打开/关闭/写入例程来写入日志文件(它从管道读取内容并将其填充到日志中)。每天午夜都会打开一个新的日志文件。系统为Windows XP Embedded。

该服务作为本地系统服务运行(为用户创建带有 NULL 的服务)。

当服务最初启动时,它会创建一个日志文件并毫无问题地写入其中。此时一切正常,您可以毫无问题地重新启动服务(或计算机)。

但是,在午夜(当日期改变时),该服务会创建一个新的日志文件并写入其中。有趣的是,这个新日志文件设置了“只读”标志。这是一个问题,因为如果服务(或计算机)重新启动,服务将无法再打开文件进行写入。

已经出现问题的系统相关信息如下:

 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\*
A C:\bbbaudit\AU090915.ADX <-- old log file (before midnight)
A R C:\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:R

C:\bbbaudit BUILTIN\Administrators:(OI)(CI)F
NT AUTHORITY\SYSTEM:(OI)(CI)F
CFN3\Administrator:F
CREATOR OWNER:(OI)(CI)(IO)F

这是我用来打开/创建日志文件的代码:

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 | S_IWRITE 用于 pmode,产生一个普通的读/写文件。

在您的情况下,您指定了 O_CREAT 但省略了第三个参数,因此 open() 使用了恰好位于堆栈中第三个参数位置的任何值。 S_IWRITE 的值为 0x0080,因此如果第三个参数位置的值恰好清除了第 7 位,则会导致只读文件。您仅在某些时候获得只读文件这一事实与作为第三个参数传递的堆栈垃圾一致。

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

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

关于windows - 为什么我的服务创建的文件的只读属性设置(有时)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1412625/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com