- •6.080401 «Інформаційні управляючи системи і технології» 6.080402 «Інформаційні технології проектування»
- •1. Структура та обсяг дисципліни
- •2. Основи програмування на мові с
- •2.1 Найпростіші конструкції мови
- •2.2 Типи даних
- •2.4 Операції мови с
- •2.5 Структура простої с програми
- •2.6 Організація введення-виведення
- •2.7 Компіляція в системі Linux
- •2.8 Організація розгалужень в програмі
- •2.9 Організація циклів
- •2.10 Оператор break
- •2.11 Оператор continue
- •2.11 Масиви
- •2.12 Функції
- •2.13 Рекурсивні функції
- •2.14 Читання і запис текстових файлів
- •2.15 Структури даних
- •3. Операційні системи
- •3.1. Поняття операційної системи
- •3.1.1 Призначення операційної системи
- •3.1.2 Операційна система як розширена машина
- •3.1.3 Операційна система як розподілювач ресурсів
- •3.2 Класифікація сучасних операційних систем
- •4 Архітектура операційних систем
- •4.1 Базові поняття архітектури операційних систем
- •4.1.1 Ядро системи. Привілейований режим і режим користувача
- •4.2 Реалізація архітектури операційних систем
- •4.2.1 Монолітні системи
- •4.2.2 Багаторівневі системи
- •4.3 Системи з мікроядром
- •4.4 Концепція віртуальних машин
- •5. Підтримка програмування в oc unix.
- •5.1. Вивчення передачі інформації
- •5.2. Змінні оточення
- •5.3. Обробка помилок
- •5.4. Правила формування і засоби розбору командних рядків
- •6. Логічна організація файлових систем
- •6. 1. Поняття файла і файлової системи
- •6.1.1. Поняття файла
- •6.1.2. Поняття файлової системи
- •6.1.3. Типи файлів
- •6.1.4. Імена файлів
- •6. 2. Організація інформації у файловій системі
- •6.2.1. Розділи
- •6.2.2. Каталоги
- •6.2.3. Зв’язок розділів і структури каталогів
- •6. 3. Зв’язки
- •6. 3. 1. Жорсткі зв’язки
- •6. 3. 2. Символічні зв’язки
- •6. 4. Атрибути файлів
- •6. 5. Операції над файлами і каталогами
- •6. 5. 1. Підходи до використання файлів процесами
- •6. 5. 2. Загальні відомості про файлові операції
- •7. Файлові операції posix
- •7.1. Відкриття і створення файлів
- •7.2. Закриття файла
- •7.3. Читання і записування даних
- •7.4. Збирання інформації про атрибути файла
- •7.5 Операції над каталогами
- •Література
5.4. Правила формування і засоби розбору командних рядків
Розглянемо правила формування і засоби розбору командних рядків.
У загальному випадку командний рядок складається з:
імені службової програми (утиліти);
опцій;
аргументів опцій;
операндів команди.
Наприклад, в команді 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 з аргументом.
#include<unistd.h>
#include<stdio.h>
int main(int argc,char *argv[])
{
int c; //Имя анализируемой опции
int aflg=0; //Признак того, что задана опция a
int bflg=0; //Признак того, что задана опция b
int errflg=0;//Флаг наличия ошибки в командной строке
int flg='?'; //Флаг (a или b), заданый в командной строке
char *ofile=NULL; //Указатель на аргумент опции o
opterr=0; /*Подавим стандартную диагностику независимо от первого символа цепочки имен опций*/
while((c=getopt(argc,argv,":abo:"))!=-1)
{
switch(c)
{
case 'a': aflg++;
flg=c;
if(bflg)
{
fprintf(stderr,"Опции a и b несовместимы\n");
errflg++;
}
break;
case 'b': bflg++;
flg=c;
if(aflg)
{
fprintf(stderr,"Опции a и b несовместимы\n");
errflg++;
}
break;
case 'o': ofile=optarg;
break;
case ':': fprintf(stderr,"Отсутствует аргумент опции -%c\n",optopt);
errflg++;
break;
case '?': fprintf(stderr,"Недопустимая опция -%c\n",optopt);
errflg++;
break;
}
}
if(errflg)
{
(void)fprintf(stderr,"Использование: %s: [-a | -b] [-o выходной_файл] [аргумент ...]\n",argv[0]);
return (1);
}
printf("Zadanniy flag: %c\n",flg);
printf("Argument opciiи o: %s\n",ofile);
printf("Ostatok komandnoi stroki: ");
for(;optind<argc;optind++)
{
printf(" %s",argv[optind]);
}
printf("\n");
return 0;
}
