Provided by: manpages-ru-dev_4.27.0-1_all bug

НАИМЕНОВАНИЕ

       system - выполняет команду оболочки (shell)

БИБЛИОТЕКА

       Стандартная библиотека языка C (libc, -lc)

ОБЗОР

       #include <stdlib.h>

       int system(const char *command);

ОПИСАНИЕ

       The system()  library function behaves as if it used fork(2)  to create a child process that executed the
       shell command specified in command using execl(3)  as follows:

           execl("/bin/sh", "sh", "-c", command, (char *) NULL);

       Функция system() возвращает результат после завершения работы команды.

       На  время  выполнения  команды  SIGCHLD  блокируется, а SIGINT и SIGQUIT игнорируются в процессе, который
       вызвал system() (эти сигналы будут обработаны их действиями по умолчанию внутри процесса-потомка, который
       выполняет command).

       Если значение command равно NULL, то system() возвращает состояние, показывающее доступна ли  оболочка  в
       системе.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

       Возвращаемым значением system() может быть одно из:

       •  Если  значение  command  равно  NULL, то возвращается ненулевое значение, если оболочка присутствует в
          системе, или 0, если оболочка недоступна.

       •  Если процесс-потомок не может быть создан  или  его  состояние  невозможно  вернуть,  то  возвращается
          значение -1, а errno присваивается код ошибки.

       •  Если  оболочка  не  может  выполниться в процессе-потомке, то возвращается значение будет таким же как
          если бы оболочка-потомок завершилась вызовом _exit(2) с состоянием 127.

       •  Если все системные  вызовы  выполнены  без  ошибок,  то  возвращается  значение  состояния  завершения
          процесса-потомка,  использовавшегося  для  выполнения  command  (состояние  завершения  оболочки — это
          состояние завершения последней выполнявшейся команды).

       В последних двух случаях возвращаемое значение — это «состояние ожидания»,  которое  можно  определить  с
       помощью макроса описанного в waitpid(2) (т. е., WIFEXITED(), WEXITSTATUS() и т. п.).

       Функция system() не отражает состояние ожидание других потомков.

ОШИБКИ

       Функция system() может завершиться  с теми же ошибками что и fork(2).

АТРИБУТЫ

       Описание терминов данного раздела смотрите в attributes(7).
       ┌─────────────────────────────────────────────────────────────────────┬──────────────────────┬──────────┐
       │ ИнтерфейсАтрибутЗначение │
       ├─────────────────────────────────────────────────────────────────────┼──────────────────────┼──────────┤
       │ system()                                                            │ Безвредность в нитях │ MT-Safe  │
       └─────────────────────────────────────────────────────────────────────┴──────────────────────┴──────────┘

СТАНДАРТЫ

       C11, POSIX.1-2008.

ИСТОРИЯ

       POSIX.1-2001, C89.

ПРИМЕЧАНИЯ

       Функция  system() проста и удобна: она позаботится обо всём для вызовов fork(2), execl(3) и waitpid(2), а
       также необходимых действиях с сигналами; также оболочка выполнит обычные  подстановки  и  перенаправления
       ввода-вывода command. Но system() не эффективна: для создания процесса требуются дополнительные системные
       вызовы, которые запускают оболочку и выполняют команду.

       Если  определён макрос тестирования свойств _XOPEN_SOURCE (до включения всех заголовочных файлов), то при
       включении <stdlib.h> становятся доступны макросы, описанные в waitpid(2) (WEXITSTATUS() и т. п.).

       Как уже упоминалось,  функция system() игнорирует SIGINT и  SIGQUIT.  Это  может  привести  к  тому,  что
       программы  вызывающие  её из цикла станут не прерываемыми, пока сами не проверят условия выхода для своих
       дочерних процессов. Пример:

           while (something) {
               int ret = system("foo");

               if (WIFSIGNALED(ret) &&
                   (WTERMSIG(ret) == SIGINT || WTERMSIG(ret) == SIGQUIT))
                       break;
           }

       В POSIX.1 не определено, вызываются ли обработчики, зарегистрированные pthread_atfork(3), при  выполнении
       system(). В реализации glibc такие обработчики не вызываются.

       Before  glibc  2.1.3, the check for the availability of /bin/sh was not actually performed if command was
       NULL; instead it was always assumed to be available, and system()  always returned 1 in this case.  Since
       glibc  2.1.3,  this  check  is  performed  because,  even  though  POSIX.1-2001  requires  a   conforming
       implementation  to  provide a shell, that shell may not be available or executable if the calling program
       has previously called chroot(2)  (which is not specified by POSIX.1-2001).

       Существует  вероятность,  что  команда  оболочки  возвратит  значение  127,  которое  также  является   и
       возвращаемым  значением  самой system(); в этом случае нельзя понять, что невозможно выполнить оболочку в
       процессе-потомке.

   Предостережения
       Не используйте system() в привилегированных программах (программы с  set-user-ID  или  set-group-ID,  или
       программы с мандатами), так как могут использоваться странные значения некоторых переменных окружения для
       разрушения  целостности  системы.  Например,  PATH  может  быть  изменена так, что произвольная программа
       выполняется с расширенными правами. Вместо этого используйте семейство функций exec(3), но  не  execlp(3)
       или execvp(3) (которые также используют переменную окружения PATH для поиска исполняемого файла).

       Функция   system(),  фактически,  работает  неправильно  для  программ  с  привилегиями  set-user-ID  или
       set-group-ID в системах, где /bin/sh это bash версии 2: для  безопасности  bash  2  при  запуске  убирает
       привилегии  (в Debian используется другая оболочка, dash(1), которая не делает этого, если вызывается как
       sh).

       Любой  введённые  пользователем  данные,  выполняемые  как  часть  команды,   должны   быть   внимательно
       отцензурированы  так,  чтобы не выполнились неожидаемые команды оболочки или параметры команды. Эти риски
       особенно серьезны при использовании system() из привилегированной программы.

ОШИБКИ

       If the command name starts with a hyphen, sh(1)  interprets the  command  name  as  an  option,  and  the
       behavior  is  undefined.  (See the -c option to sh(1).)  To work around this problem, prepend the command
       with a space as in the following call:

               system(" -unfortunate-command-name");

СМОТРИТЕ ТАКЖЕ

       sh(1), execve(2), fork(2), sigaction(2), sigprocmask(2), wait(2), exec(3), signal(7)

ПЕРЕВОД

       Русский перевод этой страницы руководства разработал(и)  Alexander  Golubev  <fatzer2@gmail.com>,  Azamat
       Hackimov   <azamat.hackimov@gmail.com>,   Hotellook,   Nikita   <zxcvbnm3230@mail.ru>,  Spiros  Georgaras
       <sng@hellug.gr>, Vladislav <ivladislavefimov@gmail.com>, Yuri Kozlov  <yuray@komyakino.ru>,  Иван  Павлов
       <pavia00@gmail.com> и Kirill Rekhov <krekhov.dev@gmail.com>

       Этот  перевод является свободной программной документацией; он распространяется на условиях общедоступной
       лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html  версии  3  или
       более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

       Если  вы  обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом
       разработчику(ам)  по  его(их)  адресу(ам)  электронной  почты  или  по   адресу   списка рассылки русских
       переводчиков.

Справочные страницы Linux 6.9.1                   2 мая 2024 г.                                        system(3)