Por que a chamada de sistema “aberta” não está em /usr/include/unistd.h? (mas "fechar" é)

3

Na minha compreensão, a chamada do sistema open e close parece estar muito relacionada.

  • ambos lidam com arquivos
  • disponível na maioria dos tipos de unix (qualquer unix que não os contenha existia?)

Portanto, esperava encontrá-los declarados ambos no arquivo de cabeçalho /usr/include/unistd.h . No entanto - estranhamente - existe apenas "close", mas não "open" declarado lá (no meu sistema de kernel do 4.17 linux)?

A omissão da chamada do sistema open em unistd.h parece confirmada ao ler o Especificações do Open Group Base Edição 7, edição 2018

que conta no parágrafo "Declarações"

The following shall be declared as functions and may also be defined as macros. Function prototypes shall be provided.

int access(const char *, int);
unsigned alarm(unsigned);
int chdir(const char *);
int chown(const char *,> uid_t, gid_t);
int close(int);
[... some more declarations, but no "open"]

Então -stangely para mim novamente - o arquivo /usr/include/asm/unistd_64.h contém a linha

#define __NR_open 2

como se unistd.h ainda se importasse um pouco com "abertura de arquivos"?

    
por humanityANDpeace 21.07.2018 / 12:54

1 resposta

3

O pano de fundo é que você precisa

#include <fcntl.h>

para obter os sinalizadores relacionados a open() de qualquer maneira, e deve haver uma chance de não poluir o espaço de nome mais do que o necessário.

Se open() estivesse em unistd.h , esse arquivo precisaria de #include fcntl.h e isso não é desejado como padrão.

O arquivo unistd_64.h é um arquivo de inclusão interno do fornecedor não oficial e o conteúdo deste arquivo não está sujeito ao padrão POSIX.

    
por 21.07.2018 / 17:12