Лабораторная работа по Математическое обеспечение ЭВМ на тему - Process Scheduler UNIX
.docМОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ИНСТИТУТ ЭЛЕКТРОНИКИ И МАТЕМАТИКИ
(ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ)
Кафедра кибернетики
Лабораторная работа №3
по дисциплине
«Математическое обеспечение ЭВМ»
на тему: «Process Scheduler UNIX»
Выполнила студентка группы М-75
Катышева С.Н.
Проверил проф. д.т.н.
Гостев И.М.
Москва 2009
Задание: Продемонстрировать навыки работы с планировщиком UNIX на примере программы на языке С.
Программа на языке C реализует следующую задачу:
В двух текстовых файлах хранится по 10 целых чисел. Программа порождает дочерний процесс, который из первого файла выбирает только чётные числа, выводит их на экран и записывает в третий файл.
Родительский процесс ждёт завершения потомка, выбирает из второго файла только нечётные числа, также выводит их на экран и дозаписывает в третий файл. В третьем файле все числа сортируются методом Пузырька и отсортированные дозаписываются в конец.
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
void bsort(int*,int);
int main()
{
int a1[10], a2[10],a3[20];
int i,j,k,stat,pid;
FILE * f1,
* f2,
* f3;
pid = fork(); // Создаём копию текущего процесса (возвращает pid потомка родителю и 0
// потомку)
if( pid == -1 )
{
printf("\nСоздать новый процесс не удалось!\n");exit(1);
}
if( pid == 0 ) //блок программы, выполняемый в дочернем процессе
{
printf("\nРаботает дочерний процесс...\n");
f1 = fopen("massiv1.txt","r");
if (f1==NULL)
{
printf("\nНевозможно открыть файл massiv1!\n");
exit(1);
}
f3 = fopen("massiv3.txt","w");
if (f3==NULL)
{
printf("\nНевозможно открыть файл massiv3!\n");
exit(1);
}
for (i=0;i<10;i++)
{
fscanf(f1,"%d",&a1[i]);
if (!(a1[i]%2))
{
printf("%d ",a1[i]);
fprintf(f3,"%d ",a1[i]);
}
}
fprintf(f3,"\n");
printf("\n");
fclose(f3);
fclose(f1);
}
else // блок программы, выполняемый в родительском процессе
{
printf("Работает родительский процесс...\n");
printf("Ожидание завершения дочернего процесса…\n");
pid=wait(&stat);
printf("Дочерний процесс завершен… PID= %d, Код завершения: %d \n",pid,stat);
f2 = fopen("massiv2.txt","r");
if (f2==NULL)
{
printf("\nНевозможно открыть файл massiv2!\n");
exit(1);
}
f3 = fopen("massiv3.txt","a");
if (f3==NULL)
{
printf("\nНевозможно открыть файл massiv3!\n");
exit(1);
}
for (j=0;j<10;j++)
{
fscanf(f2,"%d",&a2[j]);
if(a2[j]%2)
{
printf("%d ",a2[j]);
fprintf(f3,"%d ",a2[j]);
}
}
fprintf(f3,"\n");
printf("\n");
fclose(f3);
fclose(f2);
f3 = fopen("massiv3.txt","r");
if (f3==NULL)
{
printf("\nНевозможно открыть файл massiv3!\n");
exit(1);
}
k=0;
while(!feof(f3))
if (fscanf(f3,"%d",&a3[k]) != EOF)
k++;
fclose(f3);
bsort(a3,k);
f3 = fopen("massiv3.txt","a");
if (f3==NULL)
{
printf("\nНевозможно открыть файл massiv3!\n");
exit(1);
}
for (i=0;i<k;i++)
fprintf(f3, “%d ”,a3[i]);
fprintf(f3,"\n");
fclose(f3);
}
return 0;
}
void bsort(int* a4, int k) // Сортировка пузырьком
{
int i,j;
for (i=0;i<k-1;i++)
for (j=0;j<k-i-1;j++)
if (a4[j]>a4[j+1])
{
int m=a4[j];
a4[j]=a4[j+1];
a4[j+1]=m;
}
}
Результат выполнения программы:
massiv1.txt
1 2 3 43 23 4 54 4 6 3
massiv2.txt
6 8 13 25 4 7 6 43 2 35
user@debian:~/temp/emelyst$ gcc ps.c
user@debian:~/temp/emelyst$ ./a.out
Работает родительский процесс...
Ожидание завершения дочернего процесса…
Работает дочерний процесс...
2 4 54 4 6
Дочерний процесс завершен… PID= 3687, Код завершения: 0
13 25 7 43 35
user@debian:~/temp/emelyst$ cat massiv3.txt
2 4 54 4 6
13 25 7 43 35
2 4 4 6 7 13 25 35 43 54
user@debian:~/temp/emelyst$