Win32日志文件附加共享进程写入

时间:2016-01-20 16:31:52

标签: file winapi locking

我正在写一个带有主应用程序可执行文件的日志文件,我还希望附加可执行文件。我从所有可执行文件中正确地打开和写入CreateFileEx,但是当子可执行文件写入该文件(并且成功),然后父exe写入文件后,它不幸地覆盖了孩子写的内容。例如......

1) Parent opens log.
2) Parent writes 'Line A' to log
   Log: 'Line a\n'
3) Parent launches child executable
4) Child writes 'Child Line A' to log
   Log: 'Line A\nChild Line A\n'
5) Parent writes 'Line B' to log.
   Log: 'Line A\nLine B\n

我一直在使用LockFileEx / UnlockFileEx(设置为偏移0和长度MAXDWORD),甚至尝试使用SetFilePointer将指针移动到结尾都没有成功。即在上面的序列中,写等于。

a) LockFileEx
b) SetFilePointer
c) ... write data ...
d) UnlockFileEx

注意:我添加了正确的权限,例如在打开文件时没有缓冲等,甚至尝试FlushFileBuffers都没有成功。

我会假设父文件HANDLE不知道这些更改,因此SetFilePointer(fHandle,0,NULL,FILE_END)认为它已经在最后。

有什么想法吗?

先谢谢 - 蒂姆

1 个答案:

答案 0 :(得分:0)

我不确定你的代码有什么问题,你必须提供它的整个实现 - 伪代码描述太少了。我建议不是使用文件锁定,使用普通常规文件附加的互斥,你可以使用包装类CMutexEx和CMutexExHelper,如下所示,日志记录将如下所示:

'='

我不确定这会有多高效,但至少应该是安全的。

CMutexEx和CMutexExHelper的实施:

  CMutexEx mtx("myapplogmutex", 250);
  CMutexExHelper mthHelper(mtx);
  if ( mthHelper.Aquire() ) {
    // Log to file, open it and after appending close
  }