Что такое system в c
Перейти к содержимому

Что такое system в c

  • автор:

функция system()

Краткое описание:
Функция system() передает строку, адресуемую параметром str, в качестве команды для командного процессора операционной системы.
Если функция system() вызывается с нулевым указателем, она возвращает ненулевое значение при условии доступности командного процессора и нуль в противном случае. (Программы, выполняемые в специальных средах, могут не иметь доступа к командному процессору.) Значение, возвращаемое функцией system(), определяется конкретной реализацией. Но обычно возвращается нуль при успешном выполнении команды, а ненулевое значение кода возврата означает наличие ошибки.

Очень яркий пример:
программа отображает содержимое текущего каталога

1 2 3 4 5 6 7
#include int main(void) { return system("dir"); }

Хочется узнать, какие еще команды (типа «dir») можно передавать командному процессору, искал в нете — не нашел ничего путевого.
Подскажите пожалуйста кто знает.

Что такое system в c

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 для того, чтобы в этом удостовериться.

3.2.1. Функция system()

Функция system() определена в стандартной библиотеке языка С и позволяет вызывать из программы системную команду, как если бы она была набрана в командной строке. По сути, эта функция запускает стандартный интерпретатор Bourne shell (/bin/sh) и передает ему команду на выполнение. Например, программа, представленная в листинге 3.2, вызывает команду ls -l /, отображающую содержимое корневого каталога.

Листинг 3.2. (system.c) Использование функции system()

return_value = system("ls -l /");

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

Поскольку функция system() запускает интерпретатор команд, она подвержена всем тем ограничениям безопасности, что и системный интерпретатор. Рассчитывать на наличие какой-то конкретной версии Bourne shell не приходится. В большинстве UNIX-систем программа /bin/sh представляет собой символическую ссылку на другой интерпретатор. В Linux — это bash (Bourne-Again SHell), причем в разных дистрибутивах присутствуют разные его версии. Вызов из функции system() программы с привилегиями пользователя root также может иметь неодинаковые последствия в разных системах. Таким образом, лучше создавать процессы с помощью функций fork() и exec().

Читайте также

System V API

System V API Этот набор API является базовым для второй ветви[6] UNIX — System V (AT&T Unix System V). Как и оба предыдущих, этот набор API самодостаточен для реализации практически всех возможностей ОС, но использует для этого совершенно другие модели, например сетевую абстракцию TLI вместо

Ранняя AS/400 (она же System/38)

Ранняя AS/400 (она же System/38) В конце 1985 небольшая группа разработчиков из Рочестера продемонстрировала, что на System/38 можно создать среду для программного обеспечения System/36. Стоимость оборудования снизилась настолько, что мы теперь могли создавать малые модели System/38. Это

System V UNIX

System V UNIX Начиная с 1975 года фирма AT&T начала предоставлять лицензии на использование операционной системы как научно-образовательным учреждениям, так и коммерческим организациям. Поскольку основная часть системы поставлялась в исходных текстах, написанных на языке С,

system

system Местонахождение: WINDOWSsystem32config Файл system (обратите внимание, что файл без расширения) содержит раздел реестра

ГЛАВА 3 System V IPC

ГЛАВА 3 System V IPC 3.1. Введение Из имеющихся типов IPC следующие три могут быть отнесены к System V IPC, то есть к методам взаимодействия процессов, соответствующим стандарту System V:? очереди сообщений System V (глава 6);? семафоры System V (глава 11);? общая память System V (глава 14).Термин «System V IPC»

7.3.1.1. System V IPC

7.3.1.1. System V IPC Средства System V IPC — средства передачи сообщений, основанные на имеющихся в System V возможностях общей памяти, которые были описаны ранее.Программы, взаимодействующие с помощью System V IPC, обычно определяют общие протоколы, основанные на обмене короткими (до 8 Кб)

System Сор

System Сор Производитель: Mahaon soft (http://mahaonsoft.com).Статус: коммерческая.Страница для скачивания: http://mahaonsoft.com/downloads.html.Размер: 800 Кбайт.На первый взгляд, эта программа напоминает MagicTweak (см. выше) (рис. 5.35). Действительно, некоторое сходство в интерфейсе есть. В левой части окна

System Mechanic

System Mechanic Производитель: iolo technologies (http://www.iolo.com).Статус: коммерческая.Страница для скачивания: http://www.iolo.com/download.cfm.Размер: 7,8 Мбайт.После запуска System Mechanic вы увидите окно, которое можно условно разделить на три части (рис. 5.36). В левой находятся пункты меню, каждое из которых

7.3.1.1. System V IPC

7.3.1.1. System V IPC Средства System V IPC — средства передачи сообщений, основанные на имеющихся в System V возможностях общей памяти, которые были описаны ранее.Программы, взаимодействующие с помощью System V IPC, обычно определяют общие протоколы, основанные на обмене короткими (до 8 Кб)

System.DateTime и System.TimeSpan

System.DateTime и System.TimeSpan В завершение нашего обзора базовых типов данных позволите обратить ваше внимание на то, что пространство имен System определяет несколько полезных типов данных, для которых в C# не предусмотрено ключевых слов. Это, в частности, типы DateTime и TimeSpan (задачу

Тип System.GC

Тип System.GC Библиотеки базовых классов предлагают тип класса System.GC, который позволяет программно взаимодействовать со сборщиком мусора, используя множество статических членов указанного класса. Следует заметить, что непосредственно использовать этот тип в программном

Базовые классы System.MulticastDelegate и System.Delegate

Базовые классы System.MulticastDelegate и System.Delegate Таким образом, при создании типов c помощью) ключевого слова delegate в C# вы неявно объявляете тип класса, являющегося производным от System.MulticastDelegate. Этот класс обеспечивает своим потомкам доступ к списку с адресами тех методов, которые

Тип System.Web.UI.Page

Тип System.Web.UI.Page Первым интересующим нас родительским классом является сам класс Page. Ниже описаны его многочисленные свойства, обеспечивающие возможность взаимодействия с различными Web-примитивами, такими как переменные приложения и сеанса, запросы и ответы HTTP, темы и т.д.

Тип System.Web.UI.Control

Тип System.Web.UI.Control Базовый класс System.Web.UI.Control определяет различные свойства, методы, и события, которые позволяют взаимодействовать с базовыми членами Web-элемента управления (обычно не относящимися к графическому интерфейсу). В табл. 23.9 предлагаются описания некоторых таких

Функция system в C++

If command is not a null pointer, the value returned depends on the system and library implementations, but it is generally expected to be the status code returned by the called command, if supported.

Что подразумевается под "generally expected"? В каких случаях может оказаться, что возвращаемое значение не является кодом возврата? И чем оно тогда является?

If command is not a null pointer, it causes undefined behavior.

Но ведь функция для того и нужна, чтобы выполнять команды, которые, очевидно, не null. О каком же неопределённом поведении и при каких условиях идёт речь? PS: В другом источнике возвращаемое значение вообще не связывается с выполняемой командой (если она не null) - говорится просто "Implementation-defined value". И никаких упоминаний про UB.

Отслеживать
2,537 4 4 золотых знака 9 9 серебряных знаков 25 25 бронзовых знаков
задан 11 янв 2019 в 16:29
122k 24 24 золотых знака 124 124 серебряных знака 297 297 бронзовых знаков

Ну, в первом случае, возможно, имеется в виду, как мне кажется, что вы можете возвращать что угодно - и это что угодно может иметь очень малое отношение к состоянию программы. Например, при сбое возвращать 0, а при нормальном возврате - 2. А может, реализация system вообще не в состоянии отслеживать код возврата вызываемого приложения - ну вот такая операционка досталась. А UB - ну, в том плане, что когда вы пытаетесь выполнить что угодно - то что угодно может произойти :) Нет? imho, понятно.

11 янв 2019 в 16:35
@Harry, ну обычно UB означает, что функцию можно и не вызывать))
11 янв 2019 в 16:36

У нее точно сказано, что она делает и что возвращает для нулевого указателя, так ведь? А как описать, что она будет делать для ненулевого? Описать - для всех времен и наро. операционных систем?

11 янв 2019 в 16:41
@Harry, но даже если так, это ж implementation-defined, а не undefined.
11 янв 2019 в 16:43

Кстати, случайно наткнулся вот на это: kristerw.blogspot.com/2017/09/… (!). Чуть не выпал в осадок. И ведь действительно, Clang ведет себя именно так!

11 янв 2019 в 18:47

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Если посмотреть в черновик стандарта С++ (N4791), то можно найти всего лишь пару скудных упоминаний функции system .

    В разделе 16.2.2, описывающем заголовочный файл . И там просто представлена её сигнатура:

int system(const char* string); 

Headers (nonlocal jumps), (signal handling), (variable arguments), and (runtime environment getenv , system ), provide further compatibility with C code.

Собственно, из п.2. становится ясно, что искать описание надо уже в сишном стандарте. Ну а там (С11) мы видим следующее (7.22.4.8):

Description

If string is a null pointer, the system function determines whether the host environment has a command processor. If string is not a null pointer, the system function passes the string pointed to by string to that command processor to be executed in a manner which the implementation shall document; this might then cause the program calling system to behave in a non-conforming manner or to terminate.

Returns

If the argument is a null pointer, the system function returns nonzero only if a command processor is available. If the argument is not a null pointer, and the system function does return, it returns an implementation-defined value.

Можно заметить, что никаких упоминаний UB тут нет, но есть требование к реализации предоставить соответствующую документацию о том, как должен работать командный процессор, вызванный через system и есть ли он вообще. А еще есть фраза очень похожая по возможному исходу на UB:

. to behave in a non-conforming manner or to terminate.

. вести себя несоответствующим образом или завершиться.

Но в силу того, что это всё отдано на откуп реализации - это не является UB с точки зрения стандарта языка.

Т.о. в случае затруднений с интерпретацией всё же стоит обращаться к стандарту (хотя бы черновику), а не рассчитывать на описания с других сайтов. Ради интереса я посмотрел в web архиве версию страницы cplusplus.com от ноября 2012 года и там про UB тоже ничего нет. Вполне допускаю, что в текущей версии страницы просто решили таким простым образом расшифровать вышеупомянутую мной фразу. Например, ситуация с system(nullptr) является переносимой, а всё остальное - нет и жди беды.

Насчёт "generally expected" вроде бы уже ответили, суть в том, чтобы не перекладывать поведение системы, где будет выполняться скомпилированный код, на стандарт языка, поэтому предложен некий наиболее известный случай. А что там понапишут какие-то другие реализации, и что в них должен значить этот код - дело уже самих реализаций, а не языка С.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *