ТВПиС лабораторная работа 1 / lab01
.doc
Белорусский государственный университет
информатики и радиоэлектроники
Факультет заочного, вечернего и дистанционного обучения
Специальность “Программное обеспечение информационных технологий”
Лабораторная работа №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;
}
Скриншот работы программы: