Strace - Filedescriptor 3

2

Eu não tenho certeza do que o filodescriptor número 3 significa aqui? Este descritor é algum tipo de ponteiro para a conexão feita ao disco rígido para obter o arquivo datlog.txt? Eu acho que sim porque a sub-rotina close () leva esse inteiro como um argumento mais abaixo no código. Ou é de descritor apontando para um buffer na memória onde o arquivo está armazenado?

 open("datalog.txt", O_RDONLY)              = 3
 read(3, "Hello World!!!!!!\n", 250)     = 18
 fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 3), ...}) = 0
 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,   0) = 0x7f3f71a10000
 write(1, "Read Hello World!!!!!!\n", 23) = 23
 write(1, "\n", 1)                       = 1
 close(3)                                = 0
 exit_group(0)                           = ?
 +++ exited with 0 +++
    
por java 26.07.2015 / 16:25

1 resposta

4

Strace mostra chamadas de sistema , que no GNU / Linux são funções C. Estes são emitidos pela biblioteca C nativa da qual todo processo executável precisa fazer uso de alguma forma. O código C real pode chamá-los diretamente ou usar uma função de wrapper da API, que geralmente corresponde diretamente à própria chamada do sistema.

Isso significa que você pode decifrar a maioria das chamadas sys observando a documentação da função da API correspondente, já que as assinaturas são geralmente idênticas. Por exemplo:

open("datalog.txt", O_RDONLY)

Abaixo está a assinatura para o GNU C open() , de man 2 open . A seção 2 do manual é todas as chamadas do sistema 1 :

int open(const char *pathname, int flags);

Caso você não fale C, isso leva um caminho de string, um sinalizador inteiro (neste caso O_RDONLY que significa, somente leitura) e retorna um inteiro.

Esse inteiro é um descritor de arquivo e é usado com outras funções de entrada / saída C de baixo nível, como% código%. Strace mostra o valor após o read() para o = , neste caso, 3 . Aqui está a assinatura para POSIX / GNU C open() :

ssize_t read(int fd, void *buf, size_t count);

O primeiro argumento é um descritor de arquivo inteiro.

1. Observe que o termo "chamada do sistema" refere-se ambiguamente às chamadas reais do sistema da biblioteca ou às funções do wrapper da API, já que, novamente, elas são geralmente idênticas. A seção 2 é realmente a última documentação. Tecnicamente, é a API do GNU, mas está em conformidade com POSIX , que também tem documentos oficiais - por exemplo, aqui read() . Nem todos os sistemas * nix usam a biblioteca GNU C, mas todos eles têm algum equivalente e a lógica acima ainda se aplica.

    
por 26.07.2015 / 17:18