我正在学习Unix下的网络编程,目前正试图理解套接字和文件描述符的概念。从我的理解来看,文件描述符只是指向内存中某个文件的指针数组(文件描述符表?)中的一个位置。
那么套接字描述符是否与文件描述符共享此数组,只不过指针指向套接字而已?还是说套接字有其他独特的东西?
这个数组对于每个应用程序/进程都是唯一的吗?
我正在学习Unix下的网络编程,目前正试图理解套接字和文件描述符的概念。从我的理解来看,文件描述符只是指向内存中某个文件的指针数组(文件描述符表?)中的一个位置。
那么套接字描述符是否与文件描述符共享此数组,只不过指针指向套接字而已?还是说套接字有其他独特的东西?
这个数组对于每个应用程序/进程都是唯一的吗?
是的,套接字也是文件表中的索引。至少对于UNIX系统(如Linux和OSX)而言如此,Windows则不同,这就是为令你不能使用例如read
和 write
来接收和发送数据的原因。
每个进程都有自己的“文件”描述符表。
open
或socket
返回)是一个索引,指向此表或指针,这些指针可以根据是文件还是套接字而指向不同的结构。 - Some programmer dudeSocket 在 UNIX 操作系统中只是一个文件而已。在 UNIX 操作系统中,一切都被视为文件。每当我们创建一个 socket 时,会在文件描述符表中创建一个条目,其中包含标准 i/o、标准错误和其他详细信息。文件描述符作为指向文件表的指针,文件表中包含有关要执行的操作的信息,例如读取、写入等,同时还包含对该特定文件 inode 表的指针。正如你所知道的,inode 包含了文件的所有必要详细信息。
套接字(descriptor)和文件描述符(file descriptor)之间没有区别。
套接字只是文件的一种特殊形式。
例如,您可以在套接字描述符上使用文件描述符使用的系统调用read()和write()。
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
< p > send() 和 write() 之间唯一的区别是存在 flags 参数。
file
)(在内核中)的指针和一组标志(flags
)。像文件读/写偏移量这样的东西存储在打开的文件描述符中,而不是文件描述符表中。所有这些意味着这里不仅有一个,而是_两个_间接级别在起作用。 - Armen Michaeli