Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная работа по Математическое обеспечение ЭВМ на тему - Process Scheduler UNIX

.doc
Скачиваний:
3
Добавлен:
20.05.2014
Размер:
51.2 Кб
Скачать

МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ИНСТИТУТ ЭЛЕКТРОНИКИ И МАТЕМАТИКИ

(ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ)

Кафедра кибернетики

Лабораторная работа №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$

4