Смекни!
smekni.com

Методические указания к лабораторным работам для студентов IV (стр. 3 из 4)

5.1.2. Ввести имя пользователя user№, пароль user№, где № состоит из двух цифр - порядкового номера группы в микропотоке и номера бригады.

5.1.3. Выполните команды help, ls, cd, pwd, mkdir, rmdir.

5.1.4. Изучить описания этих команд с помощью инструкций man и info.

5.1.5. Изучить описания команды script, запротоколировать с ее помощью выполнение пункта 5.1.3.

5.1.6. Установить связь с соседями, используя команды who, write, запротоколировать переписку.

5.1.7. Создать текстовый файл с произвольным содержанием при помощи команды tee. Просмотреть содержимое файла при помощи команды cat и исправить в нем ошибки при помощи текстового редактора vi.

5.1.8. Изучить справку на команды cp, unlink.

5.1.9. Сделать копию файла командой cp, удалить ее командой unlink, запротоколировать эти действия.

5.2. Создайте структуру каталогов в соответствии с вариантом. Черными линиями представлена вложенность файлов/подкаталогов в каталоги. Синими линиями представлены ссылки. Красными линиями - символические ссылки. Стрелка на красной линии указывает на целевой файл ссылки. Файлы создаются копированием ранее созданного файла командой cp с внесением в копии некоторых изменений. Ссылки создаются командой ln, символические ссылки - ей же, но с ключом -s:

Таблица 1.

Вариант 1.

Вариант 6.

Вариант 2.

Вариант 7.

Вариант 3.

Вариант 8.

Вариант 4.

Вариант 9.

Вариант 5.

Вариант 10.

5.3. Для всех вариантов выполнить следующие действия:

5.3.1. Создать ссылки (синие линии).

5.3.2. Создать символические ссылки (красные линии).

5.3.3. Сохранить протокол выполненных действий.

5.3.4. Провести ряд экспериментов, иллюстрирующих доступ к файлам по основным именам, по ссылкам и по символическим ссылкам. Для доступа использовать команду cat или редактор vi.

5.3.5. Провести ряд экспериментов, иллюстрирующих реакцию системы на удаление файла, на который имеются ссылки, и файла, на который имеются символические ссылки. Проверять результаты командой ls -la.

5.3.6. Уничтожить созданные подкаталоги и файлы в них, используя команды rmdir и unlink, сохранив, однако, файл, созданный в пункте 5.1.7 и одну его рабочую копию в домашнем каталоге.

5.3.7. Изучить справку к командам chmod и chown.

5.3.8. Открыть для своей группы доступ к своему домашнему каталогу - для поиска в каталоге и к рабочей копии файла в домашнем каталоге - для чтения и записи.

5.3.9. Послать своему партнеру сообщение об открытии доступа, указав в нем имя своего каталога и файла в нем.

5.3.10. Получив от своего партнера аналогичное сообщение, выполнить попытку чтения файла в каталоге партнера, а затем - внесения изменений в этот файл.

5.3.11. Послать своему партнеру сообщение о том, что в его файл внесены изменения.

5.3.12. Получив от партнера аналогичное сообщение, прочитать свой файл и найти в нем изменения, сделанные партнером.

5.3.13. Закрыть доступ к своему домашнему каталогу.

5.3.14. Сохранить протокол выполнения пунктов 5.3.8 - 5.3.13.

5.3.15. Изучить справку к команде ps, выполнить ее с ключами -a, -e, a, x, ax, записать результаты в файл, например: ps -e > ps.log.

5.3.16. Изучить справку к файловому менеджеру Midnight Commander, запустить его, изучить перечень доступных команд, сочетания клавиш для выполнения часто применяемых команд, особенности встроенного текстового редактора.

6. Содержание отчета.

6.1. Цель работы.

6.2. Вариант задания.

6.3. Протоколы выполненных действий согласно пунктам 5.1.5, 5.1.6, 5.1.9, 5.3.3, 5.3.14, 5.3.15.

7. Контрольные вопросы.

7.1. Какие ключи команды ls Вы знаете? Что они дают?

7.2. Чем отличаются man и info? Как с ними работать?

7.3. Команда script - назначение и применение.

7.4. Как обмениваться сообщениями с пользователями сервера Linux? Как блокировать прием сообщений?

7.5. Команды tee и cat. Назначение и применение. Чем cat отличается от more и less?

7.6. Основные команды редактора vi.

7.7. Ссылки и символические ссылки. Создание и применение.

7.8. Создание и копирование файлов и папок в Linux.

7.9. Перемещение и удаление файлов и папок в Linux.

7.10. Команды chmod и chown. Назначение и применение.

7.11. Какие права доступа Вы имеете к своему домашнему каталогу, каталогам /home и / ?

7.12. Команда ps. Назначение и применение. Ключи команды.

7.13. Особенности вызова команд Midnight Commander через сочетания клавиш.

7.14. Особенности встроенного текстового редактора файлового менеджера Midnight Commander.

7.15. Какие сочетания клавиш Midnight Commander можно было применить для выполнения этой лабораторной работы?

ЛАБОРАТОРНАЯ РАБОТА №3

МНОГОЗАДАЧНОЕ ПРОГРАММИРОВАНИЕ В LINUX

1. Цель работы: Ознакомиться с компилятором gcc, методикой отладки программ, функциями работы с процессами.

2. Краткие теоретические сведения.

Минимальным набором ключей компилятора gcc являются -Wall (выводить все ошибки и предупреждения) и -o (output file):

gcc -Wall -o print_pid print_pid.c

Команда создаст исполняемый файл print_pid.

Стандартная библиотека C (libc, реализованная в Linux в glibc), использует возможности многозадачности Unix System V (далее SysV). В libc тип pid_t определен как целое, способное вместить в себе pid. Функция, которая сообщает pid текущего процесса, имеет прототип pid_t getpid (void) и определена вместе с pid_t в unistd.h и sys/types.h).

Для создания нового процесса используется функция fork:

pid_t fork(void)

Вставляя задержку случайной длины при помощи функций sleep и rand, можно нагляднее увидеть эффект многозадачности:

sleep(rand()%4)

это заставит программу "заснуть" на случайное число секунд: от 0 до 3.

Чтобы в качестве дочернего процесса вызвать функцию, достаточно вызвать ее после ветвления:

pid = fork();

if (pid == 0) {

// если выполняется дочерний процесс, то вызовем функцию

pid=process(arg);

// выход из процесса

exit(0);

Часто в качестве дочернего процесса необходимо запускать другую программу. Для этого применяется функции семейства exec:

pid = fork();

if (pid == 0) {

// если выполняется дочерний процесс, то вызов программы

if (execl("./file","file",arg, NULL)<0) {

printf("ERROR while start process&bsol;n");

exit(-2);

}

else printf( "process started (pid=%d)&bsol;n", pid);

// выход из процесса

}

Часто родительскому процессу необходимо обмениваться информацией с дочерними или хотя бы синхронизироваться с ними, чтобы выполнять операции в нужное время. Один из способов синхронизации процессов — функции wait и waitpid:

#include <sys/types.h>

#include <sys/wait.h>

pid_t wait(int *status) - приостанавливает выполнение текущего процесса до завершения какого-либо из его процессов-потомков.

pid_t waitpid (pid_t pid, int *status, int options) - приостанавливает выполнение текущего процесса до завершения заданного процесса или проверяет завершение заданного процесса.

Если необходимо узнать состояние порожденного процесса при его завершении и возвращенное им значение, то используют макрос WEXITSTATUS, передавая ему в качестве параметра статус дочернего процесса.

status=waitpid(pid,&status,WNOHANG);

if (pid == status) {

printf("PID: %d, Result = %d&bsol;n", pid, WEXITSTATUS(status)); }

Для изменения приоритетов порожденных процессов используются функции setpriority и . Приоритеты задаются в диапазоне от -20 (высший) до 20 (низший), нормальное значение - 0. Заметим, что повысить приоритет выше нормального может только суперпользователь!

#include <sys/time.h>

#include <sys/resource.h>

int process( int i) {

setpriority(PRIO_PROCESS, getpid(),i);

printf("Process %d ThreadID: %d working with priority %d&bsol;n",i, getpid(),getpriority(PRIO_PROCESS,getpid()));

return(getpriority(PRIO_PROCESS,getpid()));

}

Для уничтожения процесса служит функция kill:

#include <sys/types.h>

#include <signal.h>

int kill(pid_t pid, int sig);

Если pid > 0, то он задает PID процесса, которому посылается сигнал. Если pid = 0, то сигнал посылается всем процессам той группы, к которой принадлежит текущий процесс.

sig - тип сигнала. Некоторые типы сигналов в Linux:

SIGKILL Этот сигнал приводит к немедленному завершению процесса. Этот сигнал процесс не может игнорировать.

SIGTERM Этот сигнал является запросом на завершение процесса.

SIGCHLD Система посылает этот сигнал процессу при завершении одного из его дочерних процессов. Пример:

if (pid[i] == status) {

printf("ThreadID: %d finished with status %d&bsol;n", pid[i], WEXITSTATUS(status));

}

else kill(pid[i],SIGKILL);

3. Методические указания.

3.1. Для ознакомления с опциями компилятора gcc, описанием функций языка С используйте инструкции man и info.

3.2. Для отладки программ удобно использовать встроенный редактор файлового менеджера Midnight Commander (MC), выделяющий цветом различные языковые конструкции и указывающий в верхней строке экрана положение курсора в файле (строка, столбец).

3.3. В файловом менеджере Midnight Commander имеется буфер команд, вызываемый сочетанием клавиш <ESС> - H, перемещение по которому производится стрелками управления курсором (вверх и вниз). Для вставки команды из буфера в командную строку используется клавиша <Enter>, для редактирования команды из буфера - клавиши <- и ->, <BackSpace> и <Delete>.