Linux open()文件描述符

时间:2010-09-09 05:09:52

标签: linux

如果我在不同的线程中多次打开同一个文件(.txt文件),则返回的文件描述符会有所不同。如果我尝试使用文件描述符write(),那么当多个线程试图写入同一个文件时,是否有任何阻止写入函数的可能性?

我担心的是当一个线程调用写入单个文件时,另一个线程调用也会写入同一个文件。那么第二个线程的写入会等待第一个线程的写入先完成吗?如果是这种情况,我如何确保第二次写入调用不会等待,并且如果有第一次写入则会立即返回,因为我不希望写入第二个线程等待。

由于

4 个答案:

答案 0 :(得分:3)

不,但是如果他们正在写文件的重叠区域,那么最新的write()将总是破坏早期的写作。

一个更常见的问题是写入的文件偏移量,这可能是您的真正问题。在这种情况下,答案是:如果您从每个线程调用open(),则不会。写入将发生在从最后write()到源自同一原始open()调用的任何描述符的剩余文件偏移量,例如由dup()获取的那些,或由同一进程中的线程共享

答案 1 :(得分:1)

如果你有多个线程共享相同的资源(在你的情况下,一个文件),你有责任使用某种同步(例如,信号量或互斥量)来确保任何一个写入正在进行中时间。否则,结果将是未定义的。 Unix不会为你跟踪这一点 - 如果你在一个线程中开始写入而在同一个文件中写入正在另一个线程中进行,则不会发生阻塞。写入将立即完成,无法保证对底层物理设备的I / O操作顺序 - 它们甚至可以交错。

答案 2 :(得分:1)

无论您是使用进程还是线程,同时写入同一文件都可能会导致问题,除非非常小心。

文件描述符是否相同无关紧要。

写入光盘文件时,

write()通常不会阻塞,因为更改只会进入操作系统缓存。无论有多少任务正在执行此操作。

但是,如果您从多个进程写入文件,则可能最终会在文件中出现垃圾,因为写入的顺序将是不确定的。


如果你想在多个线程中写入同一文件的不同部分,那么你可以使用pwrite()写入文件中的特定位置,多个线程可以共享文件描述符。如果您的主题正在做正确的事情,这是可以的。

此技术通常不适用于文本文件。文本文件通常只需一次写入一个线程即可获得可预测的内容。

答案 3 :(得分:0)

您可以在写入模式下打开文件(在这种情况下,写入可以互相破坏),或者您可以在追加模式下打开它(在这种情况下,操作系统将锁定并确保每次写入以原子方式完成,以及将来的写入 - 来自无论什么线程 - 指向文件的新结尾。)

所以,使用追加模式。你的线程会快速将数据转移到内核队列中(假设你正在刷新),然后你继续处理。如果您发现即使这还不够快,那么您可以尝试将数据从您的单个线程移动到专用于执行文件更新的线程中,但首先使用更简单,更清晰的实现来获得工作系统。