如何在 xv6 中获取有关可读和 piped/regular 的已打开文件的信息

How to get information of opened files in xv6 regarding readable and piped/regular

我正在做一个项目,我需要实现一个系统调用来打印所有进程打开的所有文件,但我无法获得可读和 piped/regular 的信息。下面是我的代码

int
lsof(void)
{
    struct proc *p;
        sti();
        acquire(&ptable.lock);
        cprintf("name \t pid \t type \t read|write \n");
      struct file* fp;
        int readable = 0;
      int piped = 0;
      for (p=ptable.proc; p<&ptable.proc[NPROC]; p++){
          readable = 0;
          piped = 0;
          fp = (struct file*) &p->ofile;
          if(fp->readable){
            readable = 1;
          }
          if(fp->type == 1){
            piped = 1;
          }
          if(readable == 1 && piped == 1){
            cprintf("%s \t %d \t piped \t R  \n", p->name, p->pid);
          }
          else if(readable == 0 && piped == 1){
            cprintf("%s \t %d \t piped \t W  \n", p->name, p->pid);
          }
          else if(readable == 1 && piped == 0){
            cprintf("%s \t %d \t regular \t R  \n", p->name, p->pid);
          }
          else if(readable == 0 && piped == 0){
            cprintf("%s \t %d \t regular \t W  \n", p->name, p->pid);
          }

        }

    release (&ptable.lock);
    return 1;
}

我收到 取消引用指向不完整类型“结构文件”的指针的错误 如果(fp->可读){

帖子看起来像是编译器错误。在源文件中添加一行,其中包含带有结构文件定义的 header;例如:

#include <linux/fs.h>

你用什么:

  • ptable:因为它是 proc.c 的内部代码,您需要将代码放在 proc.c 的末尾(或者很好地导出它)
  • struct file:您需要包含 file.h,但此文件本身依赖于 fs.h(对于 NDIRECT)和 sleeplock.h(对于 struct sleeplock).

因此,您需要:

  • 添加

    #include "fs.h"
    #include "sleeplock.h"
    #include "file.h"
    

    之前 lsof(void)

  • 将所有这些代码放在 proc.c
  • 的末尾