Модифицируйте функцию 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\n", i);
if( test1(i) == FOUND ){
printf("ответ %d\n", value); break;
}
}
}
test1(i){ int j;
for(j=1; j < 10 ; j++ ){
printf( "пробуем j=%d\n", j);
if( test2(i,j) == FOUND ) return FOUND;
/* "сквозной" return */
}
return NOTFOUND;
}
test2(i, j){
printf( "пробуем(%d,%d)\n", i, j);
if( i * j == 21 ){
printf( " Годятся (%d,%d)\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 ИНФОРМАЦИЯ ДЛЯ ВЫПОЛНЕНИЯ КУРСОВОЙ РАБОТЫ
Системное программирование (или программирование систем) — род деятельности, заключающийся в работе над системным программным обеспечением.
Основная отличительная черта системного программирования по сравнению с прикладным программированием заключается в том, что результатом последнего является выпуск программного обеспечения, предлагающего определённые услуги пользователям (например, текстовый процессор). В то время как результатом системного программирования является выпуск программного обеспечения, предлагающего сервисы по взаимодействию с аппаратным обеспечением (например, дефрагментация жёсткого диска), что подразумевает сильную зависимость таких программ от аппаратной части. В частности выделим следующее:
Системное программное обеспечение служит для обеспечения эффективной работы аппаратуры компьютера.