Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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);
   }
 }

...