我有一个c程序正在记录到文件/var/log/test.log
我有一个单独的线程,它将读取文件的内容并通过http帖子提交给我的服务器。这大概每小时发生一次。我的问题是将从该线程中清除文件的内容(例如fclose(fopen("/var/log/test.log", "w")
)导致主线程中实际将数据写入文件的任何错误?
如果确实会导致错误,那么最佳选择是什么?每次将数据发送到服务器时,都应清除(但不删除)文件。
我认为这不重要,但我正在运行OS X 10.9
答案 0 :(得分:3)
我的问题是将从该线程清除文件的内容 (例如,fclose(fopen(“/ var / log / test.log”,“w”))会导致任何错误 实际上将数据写入文件的主线程?
不要认为它一般会起作用,并且取决于你写入文件的方式(你是否保持开放写作或关闭它?) - 你可能会遇到一些讨厌的竞争条件。即使它今天对你有用,你也不知道明天或其他操作系统会发生什么。
如果确实会导致错误,那么最佳选择是什么?文件 每次将数据发送到时,都应清除(但不删除) 服务器
最好让一个线程写入文件。您可以让您的发送线程通知日志记录线程它已发送了一些数据。例如,通过将一些索引写入共享变量或将某些内容放入共享的同步队列中。写作线程将定期(比如说每100个日志写入)检查发送的内容并相应地执行操作。这是更具可扩展性的,并允许您有多个线程请求以适当的方式处理日志文件。
答案 1 :(得分:2)
你需要警惕固有的竞争条件。如果读取线程处理数据然后写入线程写入更多数据,然后读取线程截断文件,您将丢失一些数据。如果这是一个错误,那么你有一个问题。如果你没有同步线程,这将是一个问题(根据墨菲)只会在最糟糕的时刻表现出来。但是,从操作系统的角度来看,您正在做的事情不会导致任何错误。