Linux x86_64Arquivos & E/S#2
open
Abre (ou cria) um arquivo e retorna um novo descritor de arquivo para ele.
Descrição
Ponto de entrada para acessar praticamente qualquer coisa no sistema de arquivos. As flags controlam modo de acesso, criação, truncamento e uma série de comportamentos especiais (O_DIRECT, O_NONBLOCK, O_CLOEXEC, etc.).
Header:
fcntl.hman 2Nota
Prefira `openat` em código novo — permite abrir relativo a um diretório específico (via `dirfd`) em vez de sempre relativo ao diretório de trabalho atual, o que evita certas condições de corrida em código que muda de diretório.
Assinatura
int open(const char * pathname, int flags, mode_t mode);Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
| pathname | const char * | Caminho do arquivo. |
| flags | int | O_RDONLY/O_WRONLY/O_RDWR combinado com O_CREAT, O_EXCL, O_TRUNC, O_APPEND, O_CLOEXEC, etc. |
| mode | mode_t | Permissões do arquivo se criado (usado apenas com O_CREAT). |
Registradores (x86_64)
| Registrador | Papel | Argumento |
|---|---|---|
| rax | número da syscall (chamada) / valor de retorno (após SYSCALL) | — |
| rdi | argumento 1 | pathnameconst char * |
| rsi | argumento 2 | flagsint |
| rdx | argumento 3 | modemode_t |
Valor de retorno
Um novo descritor de arquivo (o menor não utilizado) em sucesso; -1 em erro, com errno definido.
Códigos de erro (errno)
- EACCES(13)
- Permissão negada.
- EEXIST(17)
- Arquivo já existe.
- EISDIR(21)
- É um diretório (operação exige um arquivo comum).
- ELOOP(40)
- Excesso de níveis de links simbólicos (loop de symlinks).
- EMFILE(24)
- Limite de arquivos abertos do processo atingido.
- ENFILE(23)
- Limite de arquivos abertos no sistema atingido.
- ENOENT(2)
- Arquivo ou diretório inexistente.
- ENOSPC(28)
- Sem espaço livre no dispositivo.
- ENOTDIR(20)
- Não é um diretório.
- EROFS(30)
- Sistema de arquivos somente leitura.