打开时清除文件内容导致错误C.

时间:2014-01-25 14:11:31

标签: c multithreading macos file fwrite

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

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

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

我认为这不重要,但我正在运行OS X 10.9

2 个答案:

答案 0 :(得分:3)

  

我的问题是将从该线程清除文件的内容   (例如,fclose(fopen(“/ var / log / test.log”,“w”))会导致任何错误   实际上将数据写入文件的主线程?

不要认为它一般会起作用,并且取决于你写入文件的方式(你是否保持开放写作或关闭它?) - 你可能会遇到一些讨厌的竞争条件。即使它今天对你有用,你也不知道明天或其他操作系统会发生什么。

  

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

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

答案 1 :(得分:2)

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