【问题标题】:Will Clearing File Contents While open Cause an Error C打开时清除文件内容会导致错误 C
【发布时间】:2014-01-25 14:11:31
【问题描述】:

我有一个 c 程序正在记录到文件 /var/log/test.log

我有一个单独的线程,它将读取文件的内容并通过 http 帖子将它们提交到我的服务器。这大约每小时发生一次。我的问题是从该线程中清除文件的内容(例如fclose(fopen("/var/log/test.log", "w"))会导致实际将数据写入文件的主线程中的任何错误吗?

如果这确实会导致错误,那么最好的选择是什么?每次将数据发送到服务器时,都应清除(但不删除)该文件。

我认为这并不重要,但我运行的是 OS X 10.9

【问题讨论】:

  • 为什么需要从单独的线程中清除它?
  • @InsertNameHere 因为它只需要在每次发送数据时清除,并且由于它在计时器上而发生在不同的线程中
  • @WilliamPursell 将在文件打开并在主线程中写入时从另一个线程调用ftruncate 导致错误?
  • 这取决于您对“错误”的定义,但我强烈怀疑答案是否定的。从操作系统的角度来看应该不会有任何错误。

标签: c multithreading macos file fwrite


【解决方案1】:

我的问题是从那个线程中清除文件的内容 (例如 fclose(fopen("/var/log/test.log", "w")) 导致任何错误 真正将数据写入文件的主线程?

不要认为它通常会起作用,并且取决于您写入文件的方式(您是保持打开以进行写入还是关闭它?) - 您可能会遇到一些令人讨厌的竞争条件。即使它今天对你有用,你也不知道明天或在另一个操作系统上会发生什么。

如果这确实会导致错误,那么最好的选择是什么?文件 每次将数据发送到 服务器。

最好让一个线程写入文件。你可以让你的发送线程通知日志线程它已经发送了一些数据。例如,通过将一些索引写入共享变量或将某些内容放入共享同步队列中。写入线程将定期(例如每 100 次日志写入)检查发送的内容并采取相应措施。这更具可扩展性,并且允许您有多个线程请求以适当的方式处理日志文件。

【讨论】:

  • 您认为一个线程将消息传递给另一个线程的最佳方式是什么?
  • @735Tesla - 没有最好的方法,各有优缺点。如果您可以访问经过编写和测试的同步队列,那么这似乎是一种清晰且可扩展的方式。如果工作量太大,您可以尝试以同步方式写入和读取共享变量。
  • 我想我可能会走最懒惰的路线,并设置一个 cron 作业来每小时做我想做的事情 :)
  • @735Tesla - 这也可能导致您的主线程出错,或者作业可能会因为文件被另一个进程锁定而失败。
【解决方案2】:

您需要警惕固有的竞争条件。如果读取线程处理数据,然后写入线程写入更多数据,然后读取线程截断文件,您将丢失一些数据。如果这是一个错误,那么你就有问题了。如果您不同步线程,这将是一个问题,(根据 Murphy 的说法)只会在最糟糕的时刻表现出来。但是,从操作系统的角度来看,您所做的不会导致任何错误。

【讨论】:

    猜你喜欢
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    相关资源
    最近更新 更多