Скачиваний:
14
Добавлен:
01.04.2014
Размер:
136.19 Кб
Скачать

Белорусский государственный университет

информатики и радиоэлектроники

Факультет заочного, вечернего и дистанционного обучения

Специальность “Программное обеспечение информационных технологий”

Лабораторная работа №1

по дисциплине «Теория вычислительных процессов и структур»

Бондаренко Александра Леонидовича

Группа 701021с

Зачетная книжка 701021с-06

Электронный адрес AlexBond2@tut.by

Минск – 2009

Процессы и потоки в ОС LINUX

Цель работы – исследовать методы создания процессов в ОС Linux, основные функции создания и управления процессами, обмен данными между процессами.

Задание.

Написать программу синхронизации двух каталогов, например, Dir1 и Dir2. Пользователь задаёт имена Dir1 и Dir2. В результате работы программы файлы, имеющиеся в Dir1, но отсутствующие в Dir2, должны скопироваться в Dir2 вместе с правами доступа. Процедуры копирования должны запускаться с использованием функции fork() в отдельном процессе для каждого копируемого файла. Каждый процесс выводит на экран свой pid, имя копируемого файла и число скопированных байт. Число запущенных процессов не должно превышать N (вводится пользователем).

Решение.

Описание алгоритма: проверяется наличие аргументов – имена каталогов, при их не обнаружении выводится сообщение "Too few parameters" о нехватке аргументов и завершается выполнение. Иначе задается вопрос о количестве процессов, ожидается их ввод пользователем. Открывается первый каталог и цикл проходит по всем файлам каталога. Для каждого нового файла создается новый процесс, пока количество созданных процессов не превысит допустимое, и происходит копирование через функцию copyf().

Функция копирования файлов copyf(char *filein, char *fileout), побайтно копирует файл filein, и его права доступа, в файл fileout . Если же файл fileout существует функция возвращает 1. Права доступа копируются, через функции stat() и chmod(). При успешном выполнении операции, функция возвращает 0.

Листинг программы

#include <unistd.h>

#include <fcntl.h>

#include <stdio.h>

#include <dirent.h>

#include <sys/types.h>

#include <sys/stat.h>

int copyf(char *filein, char *fileout);

int main (int argc, char *argv [])

{

int Num;

char *Dir1,*Dir2;

if (argc != 3) {

printf ("Too few parameters\n");

return 1;

}

Dir1 = argv[1];

Dir2 = argv[2];

printf("How many process?\n");

scanf("%d",&Num);

char File1[256],File2[256];

DIR *d = opendir (Dir1);

if (!d){

printf("Error opendir");

return 1;

}

struct dirent *dt;

int n = 0;

while((dt=readdir(d))){

printf("%4d. %s\n", n++,dt->d_name);

if (n<3) continue;

sprintf(File1,"%s/%s",Dir1,dt->d_name);

sprintf(File2,"%s/%s",Dir2,dt->d_name);

pid_t pid;

if (Num>0) pid = fork ();

Num--;

if (pid == 0){

if (!copyf(File1,File2))

printf("file '%s' copied by #%d\n",

dt->d_name,getpid());

return 0;

} else {

if (!copyf(File1,File2))

printf("file '%s' copied by #%d\n",

dt->d_name,getpid());

}

}

closedir(d);

return 0;

}

int copyf(char *filein, char *fileout)

{

FILE *f_in,*f_out;

f_in = fopen(filein,"rb");

if (!f_in) return 1;

if (fopen(fileout,"rb")) return 1;

f_out = fopen(fileout,"wb");

if (!f_out) return 1;

int bytes=0;

char c = fgetc(f_in);

while (!feof(f_in)) {

fputc(c,f_out);

bytes++;

c = fgetc(f_in);

}

fclose(f_in);

fclose(f_out);

struct stat stat_f;

stat(filein,&stat_f);

chmod(fileout,stat_f.st_mode);

printf("%d bytes ",bytes);

return 0;

}

Скриншот работы программы: