- Uma função de chamada do sistema geralmente, mas nem sempre, tem um comando ou utilitário no shell?
Às vezes. Chamadas de sistema que são úteis para expor, geralmente são expostas. Um shell que não poderia mudar de diretório não seria um shell muito útil. Alguns deles, como chdir
, são implementados como construtores de shell, porque podem afetar apenas o processo que os chamou. Outros são implementados como pequenos programas. Ainda outros não são expostos: existe muito pequeno motivo para chamar mmap
diretamente do shell, então você não pode, a menos que você escreva um wrapper (o que seria inútil de qualquer forma) .
- Existe alguma regra sobre quais tipos de chamadas de sistema têm comandos ou utilitários correspondentes no shell, e que tipos de comandos ou utilitários no shell têm chamadas de sistema correspondentes?
Não há correspondência padrão ou regra geral. Os nomes podem ser qualquer coisa, por exemplo, rm
é implementado em termos de unlink
syscall; no entanto, há também um comando unlink
que também faz isso, mas falta a maioria das opções de linha de comando e é basicamente apenas um wrapper. E o pipe
syscall, junto com os read
s e write
s correspondentes, são expostos pela sintaxe |
.
man syscalls
deve fornecer uma lista de chamadas do sistema.
- Para uma chamada do sistema e um comando ou utilitário shell correspondente, o comando ou utilitário é sempre implementado da mesma maneira que a chamada do sistema? A implementação é mesmo baseada na chamada do sistema?
Os utilitários apenas usam as chamadas do sistema, na verdade, esta é a única maneira que os utilitários podem fazer essas coisas. Você não pode, digamos, excluir um arquivo ou alterar permissões sem passar pelo mecanismo syscall, seja direta ou indiretamente.
(Imagine como seria se este não fosse o caso. Todo programa que quisesse apagar um arquivo teria que implementar seus próprios drivers de sistema de arquivos e drivers de disco rígido. Também não haveria segurança, porque cada programa seria responsável por verificar suas próprias permissões. Em vez disso, basta usar um syscall e, em seguida, o kernel calcula tudo.)