Смекни!
smekni.com

Методические указания по выполнению курсовых работ по дисциплине «Системное программное обеспечение» для студентов, обучающихся по специальностям 210100, 210200 и направлению 550200 (стр. 2 из 9)

  • Поле st_ctime изменяется (устанавливается равным текущему астрономическому времени) при применении к файлу вызовов creat, chmod, chown, link, unlink, mknod, utime*, write (т.к. изменяется длина файла); Это поле следует рассматривать как время модификации прав доступа к файлу;
  • st_mtime - write, creat, mknod, utime; Это поле следует рассматривать как время модификации содержимого файла (данных);
  • st_atime - read, creat, mknod, utime; Это поле следует рассматривать как время чтения содержимого файла (данных).

Модифицируйте функцию typeOf(), чтобы она печатала еще и эти даты.

utime(имяФайла, NULL);

Он используется для взаимодействия с программой make - в команде touch. Изменить время можно только своему файлу.

Вариант 12

Напишите аналог команды ls -l, выдающий имена файлов каталога и их коды доступа в формате rwxrw-r--. Для получения кодов доступа используйте вызов stat

stat( имяФайла, &st); кодыДоступа = st.st_mode & 0777;

Для изменения кодов доступа используется вызов

chmod(имя_файла, новые_коды);

Можно изменять коды доступа, соответствующие битовой маске

0777 | S_ISUID | S_ISGID | S_ISVTX

(смотри <sys/stat.h>). Тип файла (см. функцию typeOf) не может быть изменен. Изменить коды доступа к файлу может только его владелец.

Вариант 13

Вот программа, которая каждые 2 секунды проверяет - не изменилось ли содержимое текущего каталога:

#include <sys/types.h>

#include <sys/stat.h>

extern char *ctime();

main(){

time_t last; struct stat st;

for( stat(".", &st), last=st.st_mtime; ; sleep(2)){

stat(".", &st);

if(last != st.st_mtime){

last = st.st_mtime;

printf("Был создан или удален какой-то файл: %s",

ctime(&last));

}

}

}

Модифицируйте ее, чтобы она сообщала какое имя (имена) было удалено или создано (для этого надо при запуске программы прочитать и запомнить содержимое каталога, а при обнаружении модификации - перечитать каталог и сравнить его с прежним содержимым).

Вариант 14

Вот программа, которая каждые 2 секунды проверяет - не изменилось ли содержимое текущего каталога:

#include <sys/types.h>

#include <sys/stat.h>

extern char *ctime();

main(){

time_t last; struct stat st;

for( stat(".", &st), last=st.st_mtime; ; sleep(2)){

stat(".", &st);

if(last != st.st_mtime){

last = st.st_mtime;

printf("Был создан или удален какой-то файл: %s",

ctime(&last));

}

}

}

Модифицируйте ее, чтобы она выдавала сообщение, если указанный вами файл был кем-то прочитан, записан или удален. Вам следует отслеживать изменение полей st_atime, st_mtime и значение stat() < 0 соответственно. Если файл удален - программа завершается.

Вариант 15

Современные UNIX-машины имеют встроенные таймеры (как правило несколько) с довольно высоким разрешением. Некоторые из них могут использоваться как "будильники" с обратным отсчетом времени: в таймер загружается некоторое значение; таймер ведет обратный отсчет, уменьшая загруженный счетчик; как только это время истекает - посылается сигнал процессу, загрузившему таймер.

Вот как, к примеру, выглядит функция задержки в микросекундах (миллионных долях секунды). Примечание: эту функцию не следует использовать вперемежку с функциями sleep и alarm.

#include <sys/types.h>

#include <signal.h>

#include <sys/time.h>

void do_nothing() {}

/* Задержка на usec миллионных долей секунды (микросекунд) */

void usleep(unsigned int usec) {

struct itimerval new, old;

/* struct itimerval содержит поля:

struct timeval it_interval;

struct timeval it_value;

Где struct timeval содержит поля:

long tv_sec; -- число целых секунд

long tv_usec; -- число микросекунд

*/

struct sigaction new_vec, old_vec;

if (usec == 0) return;

/* Поле tv_sec содержит число целых секунд.

Поле tv_usec содержит число микросекунд.

it_value - это время, через которое В ПЕРВЫЙ раз

таймер "прозвонит",

то есть пошлет нашему процессу

сигнал SIGALRM.

Время, равное нулю, немедленно остановит таймер.

it_interval - это интервал времени, который будет загружаться

в таймер после каждого "звонка"

(но не в первый раз).

Время, равное нулю, остановит таймер

после его первого "звонка".

*/

new.it_interval.tv_sec = 0;

new.it_interval.tv_usec = 0;

new.it_value.tv_sec = usec / 1000000;

new.it_value.tv_usec = usec % 1000000;

/* Сохраняем прежнюю реакцию на сигнал SIGALRM в old_vec,

заносим в качестве новой реакции do_nothing()

*/

new_vec.sa_handler = do_nothing;

sigemptyset(&new_vec.sa_mask);

new_vec.sa_flags = 0;

sighold(SIGALRM);

sigaction(SIGALRM, &new_vec, &old_vec);

/* Загрузка интервального таймера значением new, начало отсчета.

* Прежнее значение спасти в old.

* Вместо &old можно также NULL - не спасать.

*/

setitimer(ITIMER_REAL, &new, &old);

/* Здесь вам необходимо ждать прихода сигнала SIGALRM */

/* Здесь вам необходимо восстановить реакцию на SIGALRM */

/* Здесь вам необходимо восстановить прежние параметры таймера */

}

Задание: в теле функции usleep() опишите функцию setitimer(), которая будет ждать прихода сигнала SIGALRM, восстанавливать реакцию на SIGALRM, восстанавливать прежние параметры таймера.

Вариант 16

Напишите "часы", выдающие текущее время каждые 3 секунды.

Вариант 17

Системный вызов fork() (вилка) создает новый процесс: копию процесса, издавшего вызов. Отличие этих процессов состоит только в возвращаемом fork-ом значении:

0 - в новом процессе. pid нового процесса - в исходном.

Задание: сделайте так, чтобы вызов fork завершился неудачей, если таблица процессов переполнена.

Вариант 18

Перепишите следующий алгоритм при помощи longjmp. Используйте нелокальный переход вместо цепочки return-ов

#define FOUND 1 /* ответ найден */

#define NOTFOUND 0 /* ответ не найден */

int value; /* результат */

main(){ int i;

for(i=2; i < 10; i++){

printf( "пробуем i=%d&bsol;n", i);

if( test1(i) == FOUND ){

printf("ответ %d&bsol;n", value); break;

}

}

}

test1(i){ int j;

for(j=1; j < 10 ; j++ ){

printf( "пробуем j=%d&bsol;n", j);

if( test2(i,j) == FOUND ) return FOUND;

/* "сквозной" return */

}

return NOTFOUND;

}

test2(i, j){

printf( "пробуем(%d,%d)&bsol;n", i, j);

if( i * j == 21 ){

printf( " Годятся (%d,%d)&bsol;n", i,j);

value = j; return FOUND;

}

return NOTFOUND;

}

Обратите внимание, что при возврате ответа через второй аргумент longjmp надо прибавить 1, а при печати ответа эту единицу необходимо отнять. Это надо сделать на случай ответа j==0, чтобы функция setjmp не вернула бы в этом случае значение 0 (признак установки контрольной точки).

Вариант 19

Написать программу на С++, выполнение которой позволяет:

создать файл,

считать данные с клавиатуры в буфер;

поместить данные из буфера в созданный файл;

закрыть этот файл;

открыть этот файл и вывести его содержимое на экран монитора, закрыть файл.

Вариант 20

Написать программу на С++, выполнение которой позволяет:

проверить наличие файла на диске;

если файл существует, открыть его. Если файл не существует создать его;

считать данные с клавиатуры в буфер;

поместить данные из буфера в созданный файл;

закрыть этот файл.

Отобразить содержимое файла на экране

Вариант 21

Написать программу на С++, выполнение которой позволяет:

проверить наличие двух файлов на диске;

если файлы существуют, открыть их. Если файлы не существуют, создать их, ввести данные;

перенаправить информацию из одного файла в другой;

закрыть файлы.

Отобразить содержимое файлов на экране.

Вариант 22

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

Вариант 23

Написать программу, определяющую минимальное, максимальное значения элементов одномерного массива. Элементы массива вводятся с клавиатуры с использованием указателей.

Вариант 24

Вывести на экран номер элемента одномерного массива, его значение, адрес ячейки памяти с использованием указателей. Элементы массива вводятся с клавиатуры.

Вариант 25

Написать программу, суммирующую элементы одномерного массива. Элементы массива вводятся с клавиатуры. Ввод данных, обращение к элементам массива осуществляется с помощью указателей.

Вариант 26

Отсортировать элементы массива. Ввод данных осуществляется с использованием указателей.

Вариант 27

Написать программу с использованием переменной типа структура. Ввод/вывод, обращение к элементам структуры осуществляется с помощью указателей.

Вариант 28

Написать программу с использованием операций new, delete (например, просуммировать элементы массива, память под массив распределить динамически).

4 ИНФОРМАЦИЯ ДЛЯ ВЫПОЛНЕНИЯ КУРСОВОЙ РАБОТЫ

Системное программирование (или программирование систем) — род деятельности, заключающийся в работе над системным программным обеспечением.

Основная отличительная черта системного программирования по сравнению с прикладным программированием заключается в том, что результатом последнего является выпуск программного обеспечения, предлагающего определённые услуги пользователям (например, текстовый процессор). В то время как результатом системного программирования является выпуск программного обеспечения, предлагающего сервисы по взаимодействию с аппаратным обеспечением (например, дефрагментация жёсткого диска), что подразумевает сильную зависимость таких программ от аппаратной части. В частности выделим следующее:

  • программист должен учитывать специфику аппаратной части и другие свойства системы в которой функционирует программа, использовать эти свойства, например, применяя специально оптимизированный для данной архитектуры алгоритм.
  • обычно используется низкоуровневый язык программирования или такой диалект языка программирования, который
    • позволяет функционирование в окружении с ограниченным набором системных ресурсов.
    • работает максимально эффективно и имеет минимальное запаздывание по времени завершения.
    • имеет маленькую библиотеку времени выполнения (RTL) или не имеет её вообще.
    • позволяет прямое управление (прямой доступ) к памяти и управляющей логике.
    • позволяет делать ассемблерные вставки в код.
  • отладка программы может быть затруднена при невозможности запустить её в отладчике из-за ограничений на ресурсы, поэтому может применяться компьютерное моделирование для решения этой проблемы.

Системное программное обеспечение служит для обеспечения эффективной работы аппаратуры компьютера.