Socket和文件描述符

35

我正在学习Unix下的网络编程,目前正试图理解套接字和文件描述符的概念。从我的理解来看,文件描述符只是指向内存中某个文件的指针数组(文件描述符表?)中的一个位置。

那么套接字描述符是否与文件描述符共享此数组,只不过指针指向套接字而已?还是说套接字有其他独特的东西?

这个数组对于每个应用程序/进程都是唯一的吗?


1
文件描述符是指向进程自己的文件描述符表中的记录的数字(每个进程都有一个表)。表中的每个记录都有两个值——指向打开文件描述符结构体(file)(在内核中)的指针和一组标志(flags)。像文件读/写偏移量这样的东西存储在打开的文件描述符中,而不是文件描述符表中。所有这些意味着这里不仅有一个,而是_两个_间接级别在起作用。 - Armen Michaeli
3个回答

32

是的,套接字也是文件表中的索引。至少对于UNIX系统(如Linux和OSX)而言如此,Windows则不同,这就是为令你不能使用例如readwrite 来接收和发送数据的原因。

每个进程都有自己的“文件”描述符表。


1
我的文件描述符的解释是否正确?你能说文件描述符表是某种多态性吗? - Carlj901
1
@Carlj901 是的,有点类似。文件描述符(由opensocket返回)是一个索引,指向此表或指针,这些指针可以根据是文件还是套接字而指向不同的结构。 - Some programmer dude

16

Socket 在 UNIX 操作系统中只是一个文件而已。在 UNIX 操作系统中,一切都被视为文件。每当我们创建一个 socket 时,会在文件描述符表中创建一个条目,其中包含标准 i/o、标准错误和其他详细信息。文件描述符作为指向文件表的指针,文件表中包含有关要执行的操作的信息,例如读取、写入等,同时还包含对该特定文件 inode 表的指针。正如你所知道的,inode 包含了文件的所有必要详细信息。


1
UNIX中的所有内容都被视为文件吗?比如所有的进程?此外,套接字文件是什么样子或者包含什么? - gfdsal
1
将文件描述符定义为“指针”到文件表可能会让人困惑,因为文件描述符被定义为一个整数。也许更好的说法是,文件描述符是内核中文件描述符表数组的索引(复数形式为“indices”)。 - Dražen G.

12

套接字(descriptor)和文件描述符(file descriptor)之间没有区别。

套接字只是文件的一种特殊形式。

例如,您可以在套接字描述符上使用文件描述符使用的系统调用read()write()

ssize_t send(int sockfd, const void *buf, size_t len, int flags);
< p > send()write() 之间唯一的区别是存在 flags 参数。
flags 参数为零时,send() 等同于 write()


但是“文件”与“文件描述符”不同,对吗?套接字既可以是文件,又可以是文件描述符,这是怎么回事?我觉得套接字类似于文件描述符,而套接字缓冲区类似于文件。 - Brad Pitt
1
@BradPitt 在不是专家的情况下,我认为文件描述符是一个指向套接字的索引,就像一个文件一样。它让内核找到套接字(在内存中作为文件存储),其他程序如你可能编写的程序可以使用其文件描述符(一个整数,只是I/O资源列表中的索引。0、1和2文件描述符是stdin、stdout和stderr。)来引用套接字。 - BipedalJoe
“文件描述符是应用程序中的整数,它指向内核中的文件描述。文件描述是内存中的结构,内核在其中维护打开文件的状态并使用它来处理文件。” - Dražen G.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接