Что такое Омод в Xv6? - PullRequest
       12

Что такое Омод в Xv6?

0 голосов
/ 18 ноября 2018

при работе с файлами в xv6 я вижу целочисленную переменную с именем Omode. что это? какие значения он может иметь?

например, это системный вызов open из Xv6:

int sys_open(void)
{
  char *path;
  int fd, omode;
  struct file *f;
  struct inode *ip;

  if (argstr(0, &path) < 0 || argint(1, &omode) < 0)
    return -1;

  begin_op();

  if (omode & O_CREATE) {
    ip = create(path, T_FILE, 0, 0);
    if (ip == 0) {
      end_op();
      return -1;
    }
  } else {
    if ((ip = namei(path)) == 0) {
      end_op();
      return -1;
    }
    ilock(ip);
    if (ip->type == T_DIR && omode != O_RDONLY) {
      iunlockput(ip);
      end_op();
      return -1;
    }
  }

  if ((f = filealloc()) == 0 || (fd = fdalloc(f)) < 0) {
    if (f)
      fileclose(f);
    iunlockput(ip);
    end_op();
    return -1;
  }
  iunlock(ip);
  end_op();

  f->type = FD_INODE;
  f->ip = ip;
  f->off = 0;
  f->readable = !(omode & O_WRONLY);
  f->writable = (omode & O_WRONLY) || (omode & O_RDWR);
  return fd;
}

похоже, что это может быть O_WRONLY, O_RDWR или O_CREATE. что представляют эти значения?

1 Ответ

0 голосов
/ 26 ноября 2018

omode (расшифровывается как Open Mode), является вторым аргументом для системного вызова open в операционной системе xv6 и представляет режим (ы), которые будут использоваться при открытии файла, имя и путь которого были заданы в первом аргументе.

Из официальной книги xv6 :

open (имя файла, флаги) Открыть файл; флаги обозначают чтение / запись

Допустимые опции для этого поля: (определения находятся в fcntl.h):

#define O_RDONLY  0x000
#define O_WRONLY  0x001
#define O_RDWR    0x002
#define O_CREATE  0x200

Где:

  • O_RDONLY - указывает, что файл должен быть открыт в режиме только для чтения. Не разрешать запись в файл, представленный дескриптором файла, возвращенного из открытого вызова.
  • O_WRONLY - То же, что и выше, но позволяет писать только без чтения.
  • O_RDWR - разрешает чтение и запись.
  • O_CREATE - позволяет открывать, чтобы создать данный файл, если он еще не существует.

Вы также можете следовать коду чуть дальше и посмотреть, где используются читаемые и доступные для записи:

чтение читаемых блоков, когда это не разрешено:

// Read from file f.
int
fileread(struct file *f, char *addr, int n)
{
  int r;

  if(f->readable == 0)
    return -1;
...

записываемые произведения, похожие на записи:

// Write to file f.
int
filewrite(struct file *f, char *addr, int n)
{
  int r;

  if(f->writable == 0)
    return -1;
...
...