Existe algum comando no Linux que não faça uma chamada do sistema? [fechadas]

3

Eu estava lendo sobre as chamadas do sistema e tenho dúvidas se algum comando é executado sem fazer uma única chamada de sistema. Se não, qual é o comando com um número mínimo de chamadas do sistema? Eu usei strace para alguns comandos, mas está dando uma longa lista. Alguém pode me dizer tal comando?

    
por identicon 22.08.2015 / 12:13

5 respostas

9

/bin/true e /bin/false devem ser os comandos pré-instalados com o mínimo de chamadas do sistema.

Você pode salvar algumas chamadas do sistema por meio de links estáticos:

Salve o seguinte como, por exemplo, minimal.c

int main() {
    return 0;
}

e compile-o usando

gcc --static -o minimal minimal.c

Isso fará com que você obtenha o programa minimal em sua pasta de trabalho atual.

    
por Florian Diesch 22.08.2015 / 12:31
6

Falando sobre quais syscalls são realmente executados para "rodar" ("rodar" portanto interpretado em uma aceitação mais ampla do que a que você provavelmente está se referindo) um programa, no: para um, o execve() syscall é sempre executado apenas para executar o comando (neste caso, acho melhor falarmos sobre executável), e o exit() syscall é sempre executado após o retorno de main() :

  

o compilador C faz uma chamada para exit () depois que main () retorna

( Fonte )

Para abordar de alguma forma sua pergunta, que é dependente de executável e, portanto, muito ampla: como uma prova de conceito para afirmar que provavelmente qualquer executável realmente útil utilizará pelo menos um syscall, vale a pena afirmar que, para um, é muito provável que um exit() syscall seja executado a partir do próprio programa em caso de erros; sem mencionar que qualquer abertura / fechamento executável de um descritor de arquivo fará uso do open() / close() syscalls.

No final, em qualquer comando realmente útil, provavelmente haverá pelo menos um syscall (por exemplo, como exit() se o programa apresentar um erro durante a execução e / ou open() / close() se o comando tiver ler um arquivo qualquer.)

    
por kos 22.08.2015 / 12:37
1

Sim. Existem alguns comandos que são executados sem fazer chamadas ao sistema.

Um pré-requisito de tais comandos é que eles são construídos no shell ( bash , para o meu sistema). Isso elimina tanto a sobrecarga de configuração (várias chamadas de sistema realizadas pelo vinculador e pela libc para configurar o ambiente para a execução do código) quanto a eventual chamada de saída ().

strace não ajudará a identificar esses comandos, pois eles não são programas reais. Não há arquivo que corresponda aos comandos internos e, portanto, se strace encontrar o comando, ele será uma versão externa, completa com a configuração e desmontagem de qualquer processo.

O bash command help lista todos os comandos internos disponíveis. Observe que muitos deles fazem chamadas do sistema também. Algumas que não usam chamadas do sistema:

  • function
  • for
  • declare
  • true (a versão interna; não /bin/true )
  • false (a versão interna; não /bin/false )
  • shift
  • set
  • case
  • alias / unalias
  • set / unset

Em geral ... se um comando é interno ao shell, não lê nenhuma entrada, não grava saída e só trabalha com variáveis na memória, provavelmente não usa syscall.

    
por Barry J. Burns 22.08.2015 / 15:23
1

Chamadas de sistema são a única maneira pela qual o programa pode se comunicar com o mundo externo, incluindo o anúncio de que ele foi executado até a conclusão.

Portanto, um programa que não usa nenhuma chamada de sistema não tem efeito observável e não pode finalizar ou abandonar a CPU e, portanto, deve ser executado para sempre usando a capacidade total da CPU. Não é muito útil.

    
por Simon Richter 22.08.2015 / 21:06
0

Não há muito que um programa possa fazer significativamente sem fazer nenhuma chamada de sistema. As chamadas do sistema são o principal método através do qual um programa se comunica com qualquer coisa fora do próprio programa.

A comunicação por meio de arquivos mapeados na memória ou memória compartilhada é possível, mas ainda requer chamadas do sistema para configurar isso em primeiro lugar. Depois disso, ele pode ser usado para se comunicar sem mais chamadas do sistema.

Um programa pode receber informações do exterior por meio de sinais. Mas, se nenhum manipulador de sinal estiver instalado, o sinal apenas mataria o programa, e a instalação do manipulador de sinal, em primeiro lugar, requer uma chamada de sistema. Em princípio, um programa também precisa fazer uma chamada de sistema no final do processamento de um sinal recebido, mas se o sinal foi configurado para não bloquear os sinais no recebimento, a saída do manipulador de sinal pode ser feita sem uma chamada de sistema. Isso é mais uma curiosidade do que uma técnica significativa com aplicações da vida real.

Um programa que não faz nenhuma chamada de sistema estará consumindo todo o tempo de CPU que pode obter porque dormir (na maioria dos casos) requer uma chamada de sistema. Um programa pode estar em espera porque está aguardando que as páginas mapeadas sejam carregadas do disco. Mas sem as chamadas do sistema, as únicas páginas mapeadas a serem carregadas seriam o próprio executável, que logo seria armazenado em cache.

Ao executar o programa, os resultados parciais podem ficar visíveis para outros programas, modificando sua própria linha de comando ou variáveis de ambiente. Aqueles podem ser modificados sem uma chamada de sistema.

Até mesmo um término normal de um programa envolve uma chamada de sistema. Mas um programa pode acionar um sinal para terminar sem uma chamada de sistema. Sinais que podem ser acionados incluem SIGILL, SIGBUS, SIGFPE, SIGSEGV.

Dado tudo isso, seria possível escrever um programa que, quando iniciado, faria alguns cálculos sobre os valores fornecidos na linha de comando e, eventualmente, terminaria por meio de um sinal diferente, dependendo do resultado desse cálculo. Essa não é a maneira mais útil de indicar o resultado de um cálculo, mas certamente é possível.

    
por kasperd 23.08.2015 / 11:01