Быстрое выделение оперативной памяти.
Функции malloc и free предоставляют простой универсальный механизм выделения и освобождения памяти, работающий значительно быстрее пакета malloc(3C). Описываемые функции находятся в библиотеке malloc и подключаются при использовании опции -lmalloc команд cc(1) и ld(1).
Функция malloc возвращает указатель на блок размером не менее size байт, который можно использовать в произвольных целях.
Аргументом функции free является указатель на блок, предварительно выделенный с помощью malloc; после выполнения free блок может быть выделен вновь, а хранящаяся в нем информация теряется.
В случае выхода за границы блока, выделенного функцией malloc, а также при вызове функции free с аргументом, не являвшимся результатом malloc, эффект будет непредсказуем.
Каждая из функций выделения возвращает указатель на область памяти, подходящую (после возможного преобразования типа указателя) для хранения произвольных данных.
Структура определена во включаемом файле <malloc.h>.
3. Листинг программы
Программа состоит из главного модуля rgr.c, который использует подключаемый файл с функцией обмена file_obmen.h.
Файл rgr.c:
#include <stdlib.h>
#include <sys/wait.h>
#include <stdio.h>
#include "file_obmen.h"
int main()
{
char *a4 = "4", *a3 = "3", *a2 = "2", *a1 = "1";
int p1, p2, p3, p4;
printf ("Cozdanie vseh processov:\n");
printf ("\n");
printf ("Cozdanie processa 4 \n");
printf ("Porozhdenie processa 1 processom 4\n");
printf ("Porozhdenie processa 2 processom 1\n");
printf ("Porozhdenie processa 3 processom 2\n");
p4 = fork();
if(p4)
{
p1 = fork();
exit(0);
}
if(p1)
{
file_obmen(a4, a3);
printf("Write file 4 >>> file 3\n");
p2 = fork();
}
sleep(1);
if(p2)
{
file_obmen(a3, a2);
printf("Write file 3 >>> file 2\n");
p3 = fork();
exit(0);
}
sleep(1);
if(p3)
{
file_obmen(a2, a1);
printf("Write file 2 >>> file 1\n");
printf ("\n");
printf ("Obmen zachonchen!\n");
exit(0);
}
sleep(1);
exit(0);
}
Файл file_obmen.h:
void file_obmen(char *a4, char *a3)
{
FILE *f[3];
char *c=(char*)malloc(sizeof(char));
int p1, p2;
f[1] = fopen(a3, "rb");
f[0] = fopen(a4, "rb");
f[2] = fopen("buf", "wb");
while(!feof(f[0]))
{
c[0] = fgetc(f[0]);
fputc(c[0],f[2]);
}
fclose(f[0]);
f[0] = fopen(a4, "wb");
while(!feof(f[1]))
{
c[0] = fgetc(f[1]);
fputc(c[0], f[0]);
}
fclose(f[0]);
fclose(f[2]);
f[2] = fopen("buf", "rb");
f[1] = fopen(a3, "wb");
while(!feof(f[2]))
{
c[0] = fgetc(f[2]);
fputc(c[0], f[1]);
}
fclose(f[2]);
fclose(f[1]);
}
4. Тестирование
Результат выполнения программы в консоле:
Содержимое файлов при первом проходе:
Содержимое файлов при втором проходе:
Программа проверена и работает корректно.
Выводы
В данной работе частично описана структура системы UNIX, взаимоотношения между процессами, выполняющимися в режиме задачи и в режиме ядра. Процессы выполняются в режиме задачи или в режиме ядра, в котором они пользуются услугами системы благодаря наличию набора обращений к операционной системе. Архитектура системы поддерживает такой стиль программирования, при котором из небольших программ, выполняющих только отдельные функции, но хорошо, составляются более сложные программы, использующие механизм каналов и переназначение ввода-вывода.
Обращения к операционной системе позволяют процессам производить операции, которые иначе не выполняются. В дополнение к обработке подобных обращений ядро операционной системы осуществляет общие учетные операции, управляет планированием процессов, распределением памяти и защитой процессов в оперативной памяти, обслуживает прерывания, управляет файлами и устройствами и обрабатывает особые ситуации, возникающие в системе. В функции ядра системы UNIX намеренно не включены многие функции, являющиеся частью других операционных систем, поскольку набор обращений к системе позволяет процессам выполнять все необходимые операции на пользовательском уровне.
Литература
1. Дж. Такет (мл.), С.Барнет. Использование Linux/ Специальное издание.: 5-е изд.: Пер. с англ.: Уч.пос. – М.: Издательский дом «Вильямс», 2000. – 784 с.
2. Максимальная защита Linux. Искусство настройки.: Пер. с англ./ под.ред. Дж.Рея – СПб.: ООО «ДиаСофтЮП», 2002. – 752 с.
3. Браун С. Операционная система UNIX - М.: Мир, 1986 - 463 с.