Когда вы пишете программу для ОС Linux (или UNIX и UNIX-подобных систем), следует принимать во внимание то, что программа будет выполняться в многозадачной среде или
В этой главе рассматривается окружение, в котором действуют программы, как они его используют для получения информации об условиях функционирования и как пользователи программ могут изменять их поведение. В частности, в данной главе рассматриваются следующие темы:
передача аргументов в программы;
переменные окружения;
определение текущего времени;
временные файлы;
получение информации о пользователе и рабочем компьютере;
формирование и настройка регистрируемых сообщений;
выявление ограничений, накладываемых системой.
Аргументы программы
Когда в ОС Linux или UNIX выполняется программа на языке С, она начинается с функции main
. В таких программах функция main
объявляется следующим образом:
int main(int argc, char *argv[])
Здесь argc
— это счетчик аргументов программы, a argv
— массив символьных строк, представляющих сами аргументы.
Вы можете встретить программы на языке С для ОС Linux, просто объявляющие функцию main
как
main
Этот вариант тоже работает, поскольку по умолчанию возвращаемому функцией значению будет назначен тип int
, а формальные параметры, которые в функции не применяются, не нуждаются в объявлении. Параметры argc
и argv
остаются на своем месте, но если вы не объявляете их, то и не можете их использовать.
Каждый раз, когда операционная система запускает новую программу, параметры argc
и argv
устанавливаются и передаются функции main
. Обычно эти параметры предоставляются другой программой, часто командной оболочкой, которая запросила у операционной системы запуск новой программы. Оболочка принимает заданную командную строку, разбивает её на отдельные слова и использует их для заполнения массива argv
. Помните о том, что до установки параметров argc
и argv
командная оболочка Linux обычно выполняет раскрытие метасимволов в аргументах, содержащих имена файлов, в то время как оболочка MS-DOS рассчитывает на то, что программы примут аргументы с метасимволами и выполнят собственную постановку.
Например, если мы дадим командной оболочке следующую команду:
$ myprog left right 'and center'
программа myprog запустит функцию main
с приведенными далее параметрами.
argc: 4
argv: {"myprog", "left", "right", "and center"}
Обратите внимание на то, что аргумент-счётчик содержит имя программы и в массив argv
оно включено как первый элемент argv[0]
. Поскольку в команде оболочки мы применили кавычки, четвертый аргумент представляет собой строку, содержащую пробелы.
Вам все это знакомо, если вы программировали на языке С стандарта ISO/ANSI, Аргументы функции main
соответствуют позиционным параметрам в сценариях командной оболочки: $0
, $1
и т.д. Язык ISO/ANSI С заявляет, что функция main
должна возвращать значение типа int
, спецификация X/Open содержит явное объявление, данное ранее.
Аргументы командной строки удобны для передачи данных программам. Например, вы можете применить их в приложениях баз данных для передачи имени базы данных, которую хотите использовать, что позволит вам применить одну и ту же программу для работы с несколькими базами данных. Многие утилиты также используют аргументы командной строки для изменения собственного поведения или установки опций. Вы обычно задаете эти так называемыеsort
принимает переключатель для изменения обычного порядка сортировки на обратный:
$ sort -r
Опции командной строки используются очень широко, и согласованное их применение будет реальной помощью тем, кто станет использовать вашу программу. В прошлом у каждой утилиты был свой подход к формированию опций командной строки, что приводило к некоторой путанице. Например, взгляните на то, каким способом приведенные далее команды принимают параметры:
$ tar cvfB /tmp/file.tar 1024
$ dd if=/dev/fd0 of=/trap/file.dd bs=18k
$ ps ax
$ gcc --help
$ ls -lstr
$ ls -l -s -t -r