Смекни!
smekni.com

Теория вычислительных процессов и структур (стр. 1 из 8)

Алексеев Игорь Геннадиевич, Бранцевич Петр Юльянович

Учебно-методическое пособие для студентов специальности «Программное обеспечение информационных технологий» дневной формы обучения

Белорусский государственный университет информатики и радиоэлектроники

Минск 2004

В пособии рассмотрены основные команды операционной системы UNIX, предназначенные для работы с файлами и каталогами, а также для создания процессов и организации взаимодействия между ними. Даны структуры лабораторных работ по курсу «ТВПиС»

1. Основные команды ос unix

Вход в систему и выход

В ответ на приглашение системы ввести Logon вводим: sxtxx, например s5t03, где 5 – номер Вашей группы, а 03 – Ваш порядковый номер в группе. Затем после входа в систему устанавливаем с помощью команды passwd свой пароль длиной не менее 6 символов. Не забывайте свой логин и пароль! Пароль нельзя восстановить!

Пароль в зашифрованном виде находится в каталоге ./etс в файле shadow и для его сброса необходимо удалить набор символов после имени пользователя между двоеточиями. Например, пользователь stud1, запись в файле shadow:

stud1:gdwiefu@#@#$%66reHHrrnCvcn:12060:………

после удаления пароля запись должна быть следующая:

stud1::12060:………

Выход из системы можно осуществить по команде exit

Рабочие каталоги и файлы

Ваш рабочий каталог: /home/sxtxx, где x и xx – номер группы и порядковый номер студента в группе.

Включаемые файлы типа: stdio.h, stdlib.h и т.п. находятся в каталоге: /usr/include/

Работа с каталогами и файлами

Для вывода содержимого текущего каталога можно использовать команду: dir или ls, для изменения текущего каталога – команду: cd.

Для вывода полного имени текущего каталога можно использовать команду: pwd, для создания или удаления каталога – команды: mkdir и rmdir.

Для вывода на терминал содержимого файла можно использовать команду: cat имя_файла, например: cat prog.txt.

Для вызова файл-менеджера типа Norton`а набираем: mc (вызов оболочки файл-менеджера Midnight Commander) и далее работаем с его меню.

Для вызова текстового редактора набираем: joe или joe имя_создаваемого_или_редактируемого_файла. В самом редакторе практически все команды начинаются с последовательности ctrl-k, и нажатия нужного символа. Например, ctrl-k h выведет справку по основным командам редактора, а ctrl-k x завершит работу редактора с сохранением редактируемого файла.

Работа с программами и процессами

Запуск программы на выполнение:

./имя_программы например: ./prog1.exe

Для компиляции программ на С/С++ вызываем компилятор:

cc имя_входного_файла – о имя_выходного_файла или:

gcc имя_входного_файла – о имя_выходного_файла ,

где имя_входного_файла обязательно должно быть с расширением *.с или *.cpp, а имя_выходного_файла может быть любым (желательно совпадать с именем входного файла, кроме расширения).

Например: cc myprog1.c –o myprog1

или

gcc myprog1.c –o myprog1

Для вывода списка запущенных процессов можно использовать команду:

ps, например: ps –x выведет список всех запущенных процессов.

Для снятия задачи (процесса) можно использовать команду: kill pid_процесса, предварительно узнав его pid командой ps.

В каталоге ./proc находятся сведения обо всех запущенных процессах в системе, их состоянии, распределении памяти и т.д.

Типовой вид каталога:

./proc/1081/……..,

./proc/1085/………, где 1081 и 1082 соответственно pid запущенных процессов в системе.

Справку по командам системы или по языку С можно получить по команде:

man имя_команды, например: man ls

2. Лабораторные работы

Лабораторная работа №1

Работа с файлами и каталогами ОС UNIX

Цель работы – изучить основные команды ОС UNIX для работы с файлами и каталогами.

Теоретическая часть

Для выполнения операций записи и чтения данных в существующем файле его следует открыть при помощи системного вызова open. Ниже приведено описание этого вызова:

# include <sys / types.h>

# include <sys / stat.h>

# include <fcnt1.h>

int open (const char *pathname, int flags, [mode_t mode]);

Первый аргумент, pathname, является указателем на строку маршрутного имени открываемого файла. Значение pathname может быть абсолютным путём, например: /usr / keith / junk. Данный путь задаёт положение файла по отношению к корневому каталогу. Аргумент pathname может также быть относительным путём, задающим маршрут от текущего каталога к файлу, например: keith / junk или просто junk. В последнем случае программа откроет файл junk в текущем каталоге. В общем случае, если один из аргументов системного вызова или библиотечной процедуры – имя файла, то в качестве него можно задать любое допустимое маршрутное имя файла UNIX.

Второй аргумент системного вызова open - flags - имеет целочисленный тип и определяет метод доступа. Параметр flags принимает одно из значений, заданных постоянными в заголовочном файле <fcnt1.h> при помощи директивы препроцессора #define ( fcnt1 является сокращением от file control - «управление файлом»). В файле <fcnt1.h> определены три постоянных:

O_RDONLY – открыть файл только для чтения,

O_WRONLY – открыть файл только для записи,

O_RDWR – открыть файл для чтения и записи.

В случае успешного завершения вызова open и открытия файла возвращаемое вызовом open значение будет содержать неотрицательное целое число – дескриптор файла. В случае ошибки вызов open возвращает вместо дескриптора файла значение –1. Это может произойти, например, если файл не существует.

Третий параметр mode, является необязательным, он используется только вместе с флагом O_CREAT.

Следующий фрагмент программы открывает файл junk для чтения и записи и проверяет, не возникает ли при этом ошибка. Этот последний момент особенно важен: имеет смысл устанавливать проверку ошибок во все программы, которые используют системные вызовы, поскольку каким бы простым ни было приложение, иногда может произойти сбой. В приведенном ниже примере используются библиотечные процедуры printf для вывода сообщения и exit – для завершения процесса:

# include <stdlib.h> /* Для вызова exit */

# include <fcnt1.h>

char workfile=”junk”; / Задать имя рабочего файла */

main()

{

int filedes;

/* Открыть файл, используя постоянную O_RDWR из <fcnt1.h> */

/* Файл открывается для чтения / записи */

if ((filedes=open(workfile, O_RDWR)) = = -1)

{

printf (“Невозможно открыть %s&bsol;n”, workfile);

exit (1); /* Выход по ошибке */

}

/* Остальная программа */

exit (0); /* Нормальный выход */

}

Вызов open может использоваться для создания файла, например:

filedes = open (“/tmp/newfile”, O_WRONLY | O_CREAT, 0644);

Здесь объединены флаги O_CREAT и O_WRONLY, задающие создание файла /tmp/newfile при помощи вызова open. Если /tmp/newfile не существует, то будет создан файл нулевой длины с таким именем и открыт только для записи.

Параметр mode содержит число, определяющее права доступа к файлу, указывающие, кто из пользователей системы может осуществлять чтение, запись или выполнение файла. Пользователь, создавший файл, может выполнять чтение из файла и запись в него. Остальные пользователи будут иметь доступ только для чтения файла.

Следующая программа создаёт файл newfile в текущем каталоге:

# include <stdlib.h>

# include <fcnt1.h>

#define PERMS 0644 /* Права доступа при открытии с O_CREAT */

char *filename=”newfile”;

main()

{

int filedes;

if ((filedes=open (filename, O_RDWR | O_CREAT, PERMS)) = = -1)

{

printf (“Невозможно открыть %s&bsol;n”, filename);

exit (1); /* Выход по ошибке */

}

/* Остальная программа */

exit (0);

}

Другой способ создания файла заключается в использовании системного вызова creat. Так же, как и вызов open, он возвращает либо ненулевой дескриптор файла, либо –1 в случае ошибки. Если файл успешно создан, то возвращаемое значение является дескриптором этого файла, открытого для записи. Вызов creat осуществляется так:

# include <sys / types.h>

# include <sys / stat.h>

# include <fcnt1.h>

int creat (const char *pathname, mode_t mode);

Первый параметр pathname указывает на маршрутное имя файла UNIX, определяющее имя создаваемого файла и путь к нему. Так же, как и в случае вызова open, параметр mode задаёт права доступа. При этом, если файл существует, то второй параметр также игнорируется. Тем не менее, в отличие от вызова open, в результате вызова creat файл всегда будет усечён до нулевой длины. Пример использования вызова creat:

filedes = creat (“/tmp/newfile”, 0644);

что эквивалентно вызову:

filedes = open (“/tmp/newfile”, O_WRONLY | O_CREAT | O_TRUNC, 0644);

Следует отметить, что вызов creat всегда открывает файл только для записи. Например, программа не может создать файл при помощи creat, записать в него данные, затем вернуться назад и попытаться прочитать данные из файла, если предварительно не закроет его и не откроет снова при помощи вызова open.

Библиотечная процедура fopen является эквивалентом вызова open:

#include <stdio.h>

FILE *fopen (const char *filename, const char *type);

Процедура fopen открывает файл, заданный параметром filename, и связывает с ним структуру FILE. В случае успешного завершения процедура fopen возвращает указатель на структуру FILE, идентифицирующую открытый файл; объект FILE * также часто называют открытым потоком ввода / вывода (эта структура FILE является элементом внутренней таблицы). В случае неудачи процедура fopen возвращает нулевой указатель NULL. При этом, так же, как и для open, переменная errno будет содержать код ошибки, указывающий на её причину.

Второй параметр процедуры fopen указывает на строку, определяющую режим доступа. Она может принимать следующие основные значения:

r - открыть файл filename только для чтения (если файл не существует, то процедура fopen вернёт нулевой указатель NULL);

w - создать файл filename и открыть его только для записи (если файл не существует, то он будет усечён до нулевой длины);

а - открыть файл filename только для записи, все данные будут добавляться в конец файла (если файл не существует, он создаётся).

Следующий пример программы показывает использование процедуры fopen. При этом, если файл indata существует, то он открывается для чтения, а файл outdata создаётся (или усекается до нулевой длины, если он существует). Процедура fatal предназначена для вывода сообщения об ошибке. Она просто передаёт свой аргумент процедуре perror, а затем вызывается exit для завершения работы программы: