SYSTEM(3)

NOME
system - executa um comando do interpretador de comandos

SINÓPSE
#include <stdlib.h>

int system (const char * string);

DESCRIÇÃO
system() executa um comando especificado em string chamando /bin/sh -c string, e retorna após o comando ser completado. Durante a execução do comando, SIGCHLD estará bloqueado, e SIGINT e SIGQUIT serão ignorados.

VALORES RETORNADOS
O valor retornado é -1 em erros (por exemplo, falha do fork), e o estado de retorno do programa em outros casos. Este último estado de retorno está no formato especificado em wait(2). Além disso, o código de saída será WEXITSTATUS(status). No caso de /bin/sh não poder ser executado, o estado de saída será o que o comando que faz exit(127).

Se o valor de string for NULL, system() retorna não-zero se o interpretador estiver disponível e zero se não.

system() não afeta o estado de espera de nenhum outro filho.

DE ACORDO COM
ANSI C, POSIX.2, BSD 4.3.

PROPLEMAS

É extremamente ruim que a versão de system() de libc ignore interrupções. Isto faz programas chamarem ele a partir de um laço ininterrompíveis. Isto significa que para tais propósitos não se deve usar system() mas uma versão pessoal como (aviso: código não testado!)
int my_system (const char *command) {
    int pid, status;
    if (command == 0)
        return 1;
    pid = fork();
    if (pid == -1)
        return -1;
    if (pid == 0) {
        char *argv[4];
        argv[0] = "sh";
        argv[1] = "-c";
        argv[2] = command;
        argv[3] = 0;
        execve("/bin/sh", argv, environ);
        exit(127);
    }
    do {
        if (waitpid(pid, &status, 0) == -1) {
            if (errno != EINTR)
                return -1;
        } else
            return status;
    } while(1);
}

Não use system() em um programa com privilégios de suid ou sgid, pois estranhos valores para variáveis de ambiente podem ser usados para subverter a integridade do sistema. Use a família de funções exec(3) no lugar, mas não execlp(3) ou execvp(3). system() não irá, na verdade, funcionar corretamente em programas com privilégios de suid ou sgid em sistemas em que /bin/sh é bash versão 2, uma vez que bash 2 elimina privilégios na inicialização (A Debian usa um bash modificado que não faz isso quando invocado como sh.)

O teste de disponibilidade de /bin/sh não é executado na verdade; é sempre assumida sua disponibilidade. ISO C especifica a verificação, mas POSIX.2 especifica que o retorno será sempre não-zero, uma vez que um sistema sem o shell não está em conformidade, e isto é que está implementado.

Se for possível para o comando de shell retornar 127, então aquele código não é uma indicação confiável de que a chamada a execve() falhou; verifique errno para se asssegurar.

VEJA TAMBÉM
sh(1), signal(2), exec(3).

TRADUZIDO POR LDP-BR EM 02/07/2001

  Tradução:
Valter Ferraz Sanches <vfs@ezlinux.cjb.net>

  Revisão.:
André Luiz Fassone <lonely_wolf@ig.com.br>