使用posixread()write()linux调用,是否可以保证如果我以串行方式写入一个文件描述符并读取另一个文件描述符,这两个操作相互排斥...我的读文件描述符总是能看到写文件描述符最后写的内容?我相信是这样的,但我想确认一下,手册页在这方面没有多大帮助
cczfrluj1#
这取决于你从哪里得到这两个文件描述符。如果它们来自dup(2)调用,那么它们共享文件偏移量和状态,因此在其中一个上执行write(2)将影响另一个上的位置。另一方面,如果它们来自两个单独的open(2)调用,则每个调用都有自己的文件偏移量和状态。文件描述符通常只是对内核文件结构的引用,而正是该内核结构包含了大部分状态。当你打开(2)一个文件时,你会得到一个新的内核文件结构和一个引用它的新文件描述符。当你dup(2)一个文件描述符(或者通过sendmsg传递一个文件描述符)时,你会得到一个对同一个内核文件结构的新引用。
hsvhsicv2#
如果它们都引用相同的文件描述,也就是从“dup”或“dup 2”(或通过fork()继承)获得它们,则可以保证这一点。在从这些系统调用之一成功返回之后,旧的和新的文件描述符可以互换地使用。它们引用相同的打开文件描述(参见open(2)),因此共享文件偏移量和文件状态标志;例如,如果通过对其中一个描述符使用Lseek(2)来修改文件偏移量,则另一个描述符的偏移量也会改变。
fork()
umuewwlo3#
当您使用dup()或dup2()或fork()时,文件表由两个文件描述符共享。因此,如果您从一个文件描述符write某些内容,并再次通过其他文件描述符write某些内容,那么它将被追加而不是覆盖。但是如果两个独立的进程打开一个文件,则由两个进程写入的数据可能会混合。
dup()
dup2()
write
3条答案
按热度按时间cczfrluj1#
这取决于你从哪里得到这两个文件描述符。如果它们来自dup(2)调用,那么它们共享文件偏移量和状态,因此在其中一个上执行write(2)将影响另一个上的位置。另一方面,如果它们来自两个单独的open(2)调用,则每个调用都有自己的文件偏移量和状态。
文件描述符通常只是对内核文件结构的引用,而正是该内核结构包含了大部分状态。当你打开(2)一个文件时,你会得到一个新的内核文件结构和一个引用它的新文件描述符。当你dup(2)一个文件描述符(或者通过sendmsg传递一个文件描述符)时,你会得到一个对同一个内核文件结构的新引用。
hsvhsicv2#
如果它们都引用相同的文件描述,也就是从“dup”或“dup 2”(或通过
fork()
继承)获得它们,则可以保证这一点。在从这些系统调用之一成功返回之后,旧的和新的文件描述符可以互换地使用。它们引用相同的打开文件描述(参见open(2)),因此共享文件偏移量和文件状态标志;例如,如果通过对其中一个描述符使用Lseek(2)来修改文件偏移量,则另一个描述符的偏移量也会改变。
umuewwlo3#
当您使用
dup()
或dup2()
或fork()
时,文件表由两个文件描述符共享。因此,如果您从一个文件描述符write
某些内容,并再次通过其他文件描述符write
某些内容,那么它将被追加而不是覆盖。但是如果两个独立的进程打开一个文件,则由两个进程写入的数据可能会混合。