Os drivers de dispositivo de espaço do kernel geralmente implementam diretórios e arquivos que mostram /sys
ou /proc
. Os programas de espaço do usuário de longa duração também podem fazer isso?
Eu tenho um daemon ou um programa de longa duração que precisa ser consultado por alguns dados e ter alguns dados definidos por programas externos enquanto ele é executado.
Eu poderia fazer uma interface de soquetes completa, mas isso é muita sobrecarga para o programa e os solicitantes externos.
Como os desenvolvedores do kernel do Linux descobriram, usar o modelo "tudo é um arquivo" foi útil para ajustar a configuração do kernel. Eu gostaria de fazer o mesmo.
Alguns podem pensar que o /sys
diretório é o espaço sagrado do kernel, mas não vejo uma linha importante entre o que é o "sistema" e alguns outros serviços/servidores/aplicativos.
Usando FUSE... Decidi usar FUSE, o pacote 'File system in USErspace' libfuse3.so. (Depois de escrever um wrapper para ele...) Eu posso definir um array de structs, um por variável/arquivo de acesso:
struct fileObj files[] = {
{"mode", mode, getFunc, putFunc},
{"numbProcs", numbProcs, getFunc, putFunc},
{"svrHostPort", hostPort, getFunc, putFunc},
{"somethingWO", jakeBuf, NULL, putFunc}, // Write only file (why?)
{"timestamp", NULL, getTimestampFunc, NULL}, // Returns timestamp, R/O
{0}
};
O ponto de montagem para o sistema de arquivos FUSE é '/ssm/fuse'... O 'ls -l' mostra que cada entrada no array 'files' aparece como um arquivo, algum R/O, algum R/W, um W /O. O 'getTimestampFunc na posição da função 'get' mostra que uma função especial pode ser associada a um arquivo para realizar cálculos de respostas.
ribo@box:~/c$ ls -l /ssm/fuse
total 0
-rw-r--r-- 1 ribo ribo 10 Dec 28 17:17 mode
-rw-r--r-- 1 ribo ribo 1 Dec 28 17:17 numbProcs
--w------- 1 ribo ribo 3 Dec 28 17:17 somethingWO
-rw-r--r-- 1 ribo ribo 5 Dec 28 17:17 svrHostPort
-r--r--r-- 1 ribo ribo 32 Dec 28 17:17 timestamp
ribo@box:~/c$ cat /ssm/fuse/timestamp
18/12/28 17:17:27ribo@box:~/c$cat /ssm/fuse/mode
hyperSpeedribo@box:~/c$ echo slow >/ssm/fuse/mode
ribo@box:~/c$ cat /ssm/fuse/mode
slow
O 'echo >' mostra a passagem de um valor para o programa. Portanto, é fácil para mim espiar e cutucar vários parâmetros do programa enquanto ele é executado.
Eu não acho que haja alguma maneira de adicionar
/sys
ou/proc
entradas fora do kernel. Pois/sys
não faria muito sentido de qualquer maneira - é uma representação direta das estruturas de dados kobject.No entanto, você pode fornecer interfaces semelhantes do espaço do usuário, por exemplo, usando FIFOs; veja
mkfifo
para detalhes. Você pode ver uma implementação dissosysvinit
com seuinitctl
FIFO.Certamente eles podem. Você pode montar qualquer coisa (sistemas de arquivos de disco reais, sistemas de arquivos fuse, overlayfs, tmpfs, montagens de ligação, etc) abaixo
/sys
ou/proc
, estendendo e/ou substituindo as interfaces fornecidas pelo kernel.Se isso é uma boa ideia, é uma questão completamente diferente.
Exemplo: