5.1. ファイルディスクリプタとの互換性
xv6では、ファイルやパイプ、デバイスへの参照をstruct fileで表し、プロセスごとのファイルディスクリプタ表を通じて操作します。ソケットもこの枠組みに載せることで、read()/write()/close()といった既存の操作と自然に統合できます。
struct fileにソケット用の種別FD_SOCKETと、ソケットディスクリプタを保持するメンバsockを追加します。
📝 kernel/file.h
struct file {
- enum { FD_NONE, FD_PIPE, FD_INODE, FD_DEVICE } type;
+ enum { FD_NONE, FD_PIPE, FD_INODE, FD_DEVICE, FD_SOCKET } type;
int ref; // reference count
char readable;
char writable;
...
struct inode *ip; // FD_INODE and FD_DEVICE
uint off; // FD_INODE
short major; // FD_DEVICE
+ int sock; // FD_SOCKET
};
...
Note
micropsのソケット層はソケットを
intのディスクリプタで管理します。そのためstruct fileにはポインタではなくint sockを持たせます。
ファイルを閉じるfileclose()に、ソケットの場合の処理(sock_close()の呼び出し)を追加します。
📝 kernel/file.c
...
#include "file.h"
#include "stat.h"
#include "proc.h"
+#include "net/sock.h"
...
// Close file f. (Decrement ref count, close when reaches 0.)
void
fileclose(struct file *f)
{
...
begin_op();
iput(ff.ip);
end_op();
+ } else if (ff.type == FD_SOCKET) {
+ sock_close(ff.sock);
}
}
...