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

Source

6838 /*

6839  * Allocate a user file descriptor

6840  * and a file structure.

6841  * Initialize the descriptor

6842  * to point at the file structure.

6843  *

6844  * no file -- if there are no available

6845  * file structures.

6846  */

6847 falloc()

6848 {

6849     register struct file *fp;

6850     register i;

6851

6852     if ((i = ufalloc()) < 0)

6853          return(NULL);

  • u.u_ofile 中 指向打开文件结构的指针
    • 若分配失败,则返回NULL
    • 否则 i 置为分配单元在u.u_ofile的位置
同时 置u.u_ar0[R0]为i u.u_ofile[i]指向分配的文件打开结构
6854     for (fp = &file[0]; fp < &file[NFILE]; fp++)

6855          if (fp->f_count==0) {

6856           u.u_ofile[i] = fp;

6857           fp->f_count++;

6858           fp->f_offset[0] = 0;

6859           fp->f_offset[1] = 0;

6860           return(fp);

6861          }

  • 遍历file数组,寻找空闲的元素
  • 若找到,则
6862     printf("no file \n");

6863     u.u_error = ENFILE;

6864     return(NULL);

  • 若没找到,则
    • 打印错误信息
    • 抛出错误,错误代码 : ENFILE
    • 返回NULL
6865 }

6866 /* ------------------------- */

6867

6868

6869

6870

6871

6872

6873

6874

6875

6876

6877

6878

6879

6880

6881

6882

6883

6884

6885

6886

6887

6888

6889

6890

6891

6892

6893

6894

6895

6896

6897

6898

6899

Ref

Caller

⚠️ **GitHub.com Fallback** ⚠️