SYSTEM(3)

НАЗВАНИЕ
system - выполняет команды оболочки (shell)

СИНТАКСИС
#include <stdlib.h>

int system(const char * string);

ОПИСАНИЕ
system() выполняет команды, указанные в string, вызывая в свою очередь команду /bin/sh -c string, и возвращается, когда команда выполнена. Во время выполнения команды SIGCHLD будет заблокировано, а SIGINT и SIGQUIT будут игнорироваться.

ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
При ошибках возвращается значение -1, иначе возвращается статус выполнения команды. Этот возвращаемый статус определяется форматом, указанном в wait(2). Таким образом, код выхода из команды будет равен WEXITSTATUS(status). Если не может быть запущено /bin/sh, то тогда статус выхода будет такой, как при выполнении exit(127).

Если string равно NULL, то system() возвращает ненулевой результат при условии, что есть доступ к оболочке shell, и ноль, если доступа нет.

system() не отражается на дочерних процессах.

СООТВЕТСТВИЕ СТАНДАРТАМ
ANSI C, POSIX.2, BSD 4.3

ЗАМЕЧАНИЯ

Крайне неудобно, что system() игнорирует SIGINT и SIGQUIT. Это может привести к тому что программы вызывающие ее из цикла станут неприрываемыми, пока сами не проверят условия выхода для своих дочерних процессов. Например,
    while(something) {
        int ret = system("foo");
        if (WIFSIGNALED(ret) &&
            (WTERMSIG(ret) == SIGINT || WTERMSIG(ret) == SIGQUIT))
                break;

Не используйте system() в программах с привилегиями suid или sgid, потому что некоторые значения переменных окружения могут вызвать сбои в системе. Вместо нее рекомендуется использование семейства функций exec(3), но не execlp(3) или execvp(3). system() неправильно функционирует в программах с привилегиями suid или sgid тех систем, где /bin/sh заменено на bash версии 2, так как bash 2 обнуляет права при запуске. Debian использует измененный bash, который не производит при запуске этого действия так, как это делает sh.

Проверка доступности /bin/sh не производится, так как всегда подразумевается, что доступ к нему есть. ISO C описывает процесс проверки, а POSIX.2 говорит, что возвращаемое значение никогда не равно нулю, так как shell всегда считается установленным.

Существует возможность, что команда оболочки возвратит значение 127, но это неявное доказательство неуспешного вызова execve(); проверьте errno для того, чтобы в этом удостовериться.

СМ. ТАКЖЕ
sh(1), wait(2), signal(2), exec(3)