The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Интерактивная система просмотра системных руководств (man-ов)

 ТемаНаборКатегория 
 
 [Cписок руководств | Печать]

system ()
  • system (3) ( Solaris man: Библиотечные вызовы )
  • system (3) ( FreeBSD man: Библиотечные вызовы )
  • >> system (3) ( Русские man: Библиотечные вызовы )
  • system (3) ( Linux man: Библиотечные вызовы )
  • system (3) ( POSIX man: Библиотечные вызовы )
  • system (4) ( Solaris man: Специальные файлы /dev/* )
  • Ключ system обнаружен в базе ключевых слов.
  •  

    НАЗВАНИЕ

    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)


     

    Index

    НАЗВАНИЕ
    СИНТАКСИС
    ОПИСАНИЕ
    ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
    СООТВЕТСТВИЕ СТАНДАРТАМ
    ЗАМЕЧАНИЯ
    СМ. ТАКЖЕ


    Поиск по тексту MAN-ов: 




    Спонсоры:
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2020 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру