code:mknod - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki

Source

  • mknod 的系统调用,只能由超级用户调用
  • 根据参数生成 INODE(一般是特殊INODE,如 设备装载INODE),详细参看UNIX手册
  • 使用3个隐式参数
    • name : 文件路径名(文件实体一般不存在,只用于生成INODE)
    • mode : 设置为 INODE 模式位,模式常量参看inode.h
    • addr : 设置为 INODE 的i_addr[0]位

5948

5949 /*

5950  * mknod system call

5951  */

5952 mknod()

5953 {

5954     register *ip;

5955     extern uchar;

5956

5957     if(suser()) {

5958          ip = namei(&uchar, 1);

  • ip ← 根据 name 查找INODE
5959          if(ip != NULL) {

5960           u.u_error = EEXIST;

5961           goto out;

5962          }

  • 若 ip 已存在,抛出错误,释放ip
5963     }

5964     if(u.u_error)

5965          return;

  • 若 之前存在错误,则函数返回
  • 此处检测到的错误分为两类
    • namei 抛出的错误
    • suser 抛出的错误(当前用户并非超级用户)
5966     ip = maknode(u.u_arg[1]);

5967     if (ip==NULL)

5968          return;

5969     ip->i_addr[0] = u.u_arg[2];

5970

5971 out:

5972     iput(ip);

5973 }

5974 /* ------------------------- */

5975

Ref

Param

(mknod = 14.; not in assembler)
sys mknod; name; mode; addr
⚠️ **GitHub.com Fallback** ⚠️