Existe algum comando unix que não faça nenhuma chamada do sistema durante a execução?

0

Estive me perguntando se existe algum comando Unix que não faça nenhuma chamada ao sistema . Por exemplo, se considerarmos ls , ele também usa muitas chamadas do sistema, como open , read , write . Usamos o comando strace para encontrar essas chamadas.

    
por Deepak Singh 23.08.2015 / 11:05

2 respostas

5

/bin/true e /bin/false não precisam fazer nenhuma chamada do sistema além da exit(2) exigida. (GNU true e false são executáveis ELF dinamicamente vinculados, então é claro que você obtém a inicialização usual da placa de boiler).

Se você escrever um programa em asm que tenta retornar de _start , ou que continua sendo executado, ele será segfault quando a execução pular para uma página não mapeada. Então você tecnicamente pode evitar chamar exit() , mas não vale a pena. : P

Você pode ter lido que a implementação mais simples de true(1) é um arquivo vazio. Isso só funciona se chamado a partir do shell.

touch true
chmod 755 true
./true
echo $?
 0
strace ./true
 write(2, "strace: exec: Exec format error\n", 32) = 32
 exit_group(1)

Se você quiser fazer sua própria implementação true mínima, então na amd64 você pode fazer:

cat > exit64.s <<EOF
    .section .text
    .globl _start
    _start:
            xor %edi, %edi
            mov $231, %eax  #  exit(0)
            syscall

    #       movl $1,%eax    # 32bit int80 can call the 32bit ABI system calls from long mode
    #       int $0x80
EOF

as exit64.s -o exit64.o && ld exit64.o -o exit64
strace ./exit64 
 execve("./exit64", ["./exit64"], [/* 69 vars */]) = 0
 exit_group(0)                           = ?
 +++ exited with 0 +++
file exit64
 exit64: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped

Ao contrário do GNU true , este não suporta --help e --version ! (por exemplo, command true --version para ignorar o built-in de shell).

Veja também Um tutorial do Whirlwind sobre como criar executáveis ELF realmente teensivos para Linux se você pensou isso foi legal.

    
por 23.08.2015 / 15:28
0

Não.

Você sempre pode escrever um comando desse tipo, mas ele não recebe entrada e não produz saída. Mesmo sleep(1) precisa usar as chamadas do sistema para detectar a passagem do tempo.

Editar : um programa de montagem puro que não faz nada além de tentar gravar memória proibida, terminando assim com SIGSEGV .

    
por 23.08.2015 / 11:11