Назва

system - виконує оболонкову команду

Огляд

#include <stdlib.h>

int system(const char *ланцюжок);

Опис

system() виконує команду, вказану як ланцюжок, через виклик /bin/sh -c ланцюжок і повертається до основної програми після завершення команди. Під час виконання команди, SIGCHLD блоковано, а SIGINT із SIGQUIT ігноруються.

Повернені значення

У випадку помилки, повертається -1 (тобто відгалуження зазнало невдачі) і значення повернення команди в протилежному випадку. Останній статус повернення відбувається у форматі, вказаному ?wait(2). Таким чином, код виходу команди буде WEXITSTATUS(status). У випадку, якщо /bin/sh неможливо виконати, статус виходу буде той самий, що й команди exit(127).

Якщо ланцюжок дорівнює NULL, system() поверне ненульове значення, акщо оболонка доступна і нуль, якщо ні.

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 на системах, де встановлено bash(1) 2-ї версії, оскільки bash 2 зкидає привілеї при запуску. (Debian викориатовує модифіковану версію bash, яка не робить цього, якщо викликано як sh.)

Перевірка на наявність /bin/sh, власне, не відбувається; передбачається, що ця оболонка завжди присутня. ISO C вказує перевіряти, тоді як POSIX.2 відзначає, що повернене значення перевірки на наявність оболонки завжди повинне бути ненульовим, оскільки система баз оболонки не відповідає стандартові, і саме таким чином це втілено.

Є можливість, що оболонкова команда поверне 127, тож цей код не є надійним вказівником того, що execve() зазнав невдачі.

Дивіться також

?sh(1), ?signal(2), ?wait(2), ?exec(3)