- •Дослідження файлової системи
- •Робота з файлами і каталогами в ос Linux
- •Керування повноваженнями на файли та каталоги
- •Програмування обчислювальних процесів з розгалуженням
- •Використання циклів
- •Набір і відлагодження програм з використанням двовимірних масивів
- •Використання підпрограм. Використання рекурсії
- •Робота з масивами за допомогою покажчиків
- •Структури даних.Файли даних
- •Рядки символів
- •Підтримка програмування в oc Linux. Вивчення передачі інформації
- •Правила формування і засоби розбору командних рядків
- •Файлові операції за допомогою системних викликів
- •Змінні середовища|середа| оточення. Обробка помилок
- •Література
Правила формування і засоби розбору командних рядків
Мета роботи: Ознайомитися із із методом розбору командного рядка за допомогою функції getopt().
Методичні вказівки та основні теоретичні відомості
Розглянемо правила формування і засоби розбору командних рядків.
У загальному випадку командний рядок складається з:
імені службової програми (утиліти);
опцій;
аргументів опцій;
операндів команди.
Наприклад, в команді grep –f patfile foo.c bar.c baz
Ім'я
команди
Опція
Аргумент опції
Операнди
grep –f patfile foo.c bar.c baz
Розробники службових програм повинні керуватися наступними правилами.
Ім'я утиліти складається не менше ніж з двох і не більше ніж з дев'яти малих латинських букв і/або цифр.
Ім'я опції – це один буквено-цифровий символ. Опціям передує знак мінус. Після одного мінуса можуть розташовуватися декілька опцій без аргументів.
Опції відокремлені від своїх аргументів.
У опцій немає необов'язкових аргументів.
Якщо у опції декілька аргументів, вони представляються одним словом і відокремлюватися відокремлюються один від одного комами або екранованими пропусками.
Всі опції розташовуються в командному рядку перед операндами.
Спеціальний елемент командного рядка --, який не є ні опцією, ні операндом, позначає кінець опцій. Всі подальші слова трактуються як операнди, навіть якщо вони починаються із знаку мінус.
Порядок різних опцій в командному рядку не має значення. Якщо повторюється одна опція з аргументами, останні повинні інтерпретуватися в порядку, вказаному в командному рядку.
Порядок інтерпретації операндів може залежати від утиліти.
Якщо операнд задає читаний або записуваний файл, то знак мінус на його місці використовується тільки для позначення стандартного введення (або стандартного виведення виведення, якщо з контексту ясно, що специфікується вихідний файл).
Для розбору опцій і їх аргументів засобами мови С служить функція getopt() і асоційовані з нею зовнішні змінні.
#include<unistd.h>
int getopt(int argc,char *const argv[],const char *optstring);
extern char *optarg;
extern int optind,opterr,optopt;
Тут:
аргументи argc і argv задають командний рядок в тому вигляді, як він передається функції main();
optstring є ланцюжком імен опцій;
змінна optind (ізіз початковим значенням 1) служить індексом в масиві argv[].
У Результати функція getopt() повертає ім'я чергової опції з числа перерахованих в ланцюжку optstring(якщо таке вдалося виділити). За наявності у опції аргументу покажчик на нього поміщається в змінну optarg з відповідним збільшенням значення optind.
Якщо у опції аргумент відсутній, а на першому місці в optstring задано двокрапку, воно і служить результатом.
Якщо зустрілося ім'я опції, не перераховане optstring, або у опції немає аргументу, а на першому місці в optstring задано не двокрапку, то результатом стане знак питання.
У будь-якій з перерахованих вище помилкових ситуацій в змінну optopt поміщається ім'я «проблемної» опції. Крім того, в стандартний протокол видається діагностичне повідомлення. Для придушення видачі слід привласнити змінній opterr нульове значення.
Нарешті, якщо при виклику getopt() покажчик argv[optind] не відзначає початок опції (наприклад, він пустий пустий або перший символ вказуємого ланцюжка відмінний від знаку мінус), результат рівний –1 як ознака того, що розбір опцій закінчений.
Завдання
Написати програму обробки командного рядка виклику програми, що приймає опцію –a без аргументу і опцію –b з аргументом.
Лабораторна робота № 13
