Estou aprendendo Linux procfs
, que utiliza um sistema de arquivos virtual onde operações como open
, read
, write
, e release
são processadas por funções registradas nele.
Deixei o ponteiro open
e release
para null por engano, e quando tento ler o conteúdo do arquivo, com códigos Python como:
with open("/proc/testfile", "r") as f:
content = f.read()
O programa travou e li erro do kernel dmesg que o ponteiro nulo é desreferenciado, o que é esperado, pois open
é apontado para NULL.
No entanto, o cat
comando do GNU coreutils pode fazer o trabalho, me dando uma saída como
$ cat /proc/testfile
testoutput
o que significa que cat
não invocou a open
função, mas invocou diretamente read
( write
também pode ser feito).
No meu entendimento, open()
retornará um descritor de arquivo que será usado para lidar com arquivos e read()
requer um descritor de arquivo para continuar.
Como isso é feito por dentro cat
?
Você pode usar
strace
para ver qual chamada de sistema algum comando está fazendo:Além desse
O_CLOEXEC
sinalizador que não deve ter relação com o seu problema, ambos fazem exatamente a mesma chamada de sistema no meu sistema.