Linux x86_64Arquivos & E/S#257
openat
Como open, mas resolve caminhos relativos a partir de um descritor de diretório em vez do diretório de trabalho atual.
Descrição
Parte da família *at() introduzida para permitir operação segura em múltiplas threads que trabalham em diretórios diferentes (que não podem compartilhar um único 'diretório de trabalho atual' por processo), e para evitar condições de corrida TOCTOU ao caminhar por uma árvore de diretórios.
Header:
fcntl.hman 2Desde o kernel 2.6.16Assinatura
int openat(int dirfd, const char * pathname, int flags, mode_t mode);Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
| dirfd | int | Descritor do diretório base, ou AT_FDCWD para o diretório de trabalho atual. |
| pathname | const char * | Caminho, absoluto ou relativo a `dirfd`. |
| flags | int | Mesmas flags de `open`. |
| mode | mode_t | Permissões do arquivo, se criado com O_CREAT. |
Registradores (x86_64)
| Registrador | Papel | Argumento |
|---|---|---|
| rax | número da syscall (chamada) / valor de retorno (após SYSCALL) | — |
| rdi | argumento 1 | dirfdint |
| rsi | argumento 2 | pathnameconst char * |
| rdx | argumento 3 | flagsint |
| r10 | argumento 4 | modemode_t |
Valor de retorno
Um novo descritor de arquivo em sucesso; -1 em erro, com errno definido.
Códigos de erro (errno)
- EACCES(13)
- Permissão negada.
- EBADF(9)
- Descritor de arquivo inválido.
- EEXIST(17)
- Arquivo já existe.
- ENOENT(2)
- Arquivo ou diretório inexistente.
- ENOTDIR(20)
- Não é um diretório.