bsuir.info
БГУИР: Дистанционное и заочное обучение
(файловый архив)
Вход (быстрый)
Регистрация
Категории каталога
Другое [197]
Бухучет [16]
ВМиМОвЭ [4]
ОДМиТА [13]
ОЛОБД [17]
ООПиП [67]
ОС [19]
ПСОД [47]
Форма входа
Поиск
Статистика

Онлайн всего: 12
Гостей: 12
Пользователей: 0
Файловый архив
Файлы » ИСиТвЭ » ОС

КР по ОС Вариант №15
Подробности о скачивании 10.11.2011, 10:18
Содержание
1 Задание
2 Текст программы
3 Результаты выполнения программы
Литература

1 Задание
Подсчитать суммарный размер файлов в заданном каталоге (аргумент 1 командной строки) и для каждого его подкаталога отдельно. Вывести на консоль и в файл (аргумент 2 командной строки) название подкаталога, количество файлов в нём, суммарный размер файлов, имя файла с наибольшим размером. Процедура просмотра для каждого подкаталога должна запускаться в отдельном потоке. Каждый поток выводит на экран свой pid, полный путь, имя и размер просмотренного файла, общее число просмотренных файлов в подкаталоге. Число запущенных потоков в любой момент времени не должно превышать N (вводится пользователем). Проверить работу программы для каталога /usr N=6..

2 Текст программы
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <dirent.h>
#include <string.h>
#include <pthread.h>
#include <linux/unistd.h>
int fd;
void WriteFile(int aPID, char *aURL, int aCOUNT, int aSUMsize, char *aMAXFileName)
{
char PID[200];
sprintf(PID, "%d", aPID);
write(fd,"PID: ",strlen("PID: "));
strcat(PID,"\n");
write(fd,PID,strlen(PID));
write(fd,"Путь к подкаталогу: ",strlen("Путь к подкаталогу: "));
strcat(aURL,"\n");
write(fd,aURL,strlen(aURL));
char COUNT[200];
sprintf(COUNT, "%d", aCOUNT);
write(fd,"Количество файлов: ",strlen("Количество файлов: "));
strcat(COUNT,"\n");
write(fd,COUNT,strlen(COUNT));
char SUMsize[200];
sprintf(SUMsize, "%d", aSUMsize);
write(fd,"Суммарный размер: ",strlen("Суммарный размер: "));
strcat(SUMsize,"\n");
write(fd,SUMsize,strlen(SUMsize));
write(fd,"Наибольший файл: ",strlen("Наибольший файл: "));
strcat(aMAXFileName,"\n");
write(fd,aMAXFileName,strlen(aMAXFileName));
}
void print(char *FILEname, int FILEsize)
{
printf(" Имя и размер файла: %s %d байт(а)\n",FILEname, FILEsize);
}
void * pDir (void *DirName)
{
char STRwrite[200];
char _DirName[200];
strcpy(_DirName, (char*)DirName);
char Name[200];
int SUMsize=0;
int count=0;
int MAXsize=0;
char MAXFileName[200];
strcpy(MAXFileName,"Not File");
DIR *dir;
struct dirent *ent;
struct stat st;
dir=opendir(_DirName);
if (dir != NULL)
{
while ((ent = readdir(dir)) != NULL)
{
strcpy(Name,"");
strcpy(Name,_DirName);
strcpy(Name,strcat(Name,"/"));
strcpy(Name,strcat(Name,ent->d_name));
stat(Name,&st);
if (S_ISDIR(st.st_mode)==0)
{
if ((strcmp(ent->d_name,".")!=0) && (strcmp(ent->d_name,"..")!=0))
{
SUMsize=SUMsize+st.st_size;
count++;
if (MAXsize<st.st_size)
{
MAXsize=st.st_size;
strcpy(MAXFileName,ent->d_name);
}
}
print(ent->d_name,st.st_size);
}
}
printf(" PID: %d\n Путь к подкаталогу: %s\n Количество файлов: %d\n Суммарный размер: %d байт(а)\n Наибольший файл: %s\n\n",pthread_self(), _DirName, count, SUMsize, MAXFileName);
WriteFile(pthread_self(), _DirName, count, SUMsize, MAXFileName);
closedir(dir);
}
else
perror("Ошибка открытия каталога!!!");
return NULL;
}
int main(int argc, char *argv[])
{
int size=0;
char Name[200];
int result;
DIR *dir;
struct dirent *ent;
struct stat st;
int threads=atoi(argv[2]);
pthread_t thread[threads];
int id=0;
int i;
if (argc<3)
{
printf("Введены не все параметры!!!\n");
exit(1);
}
fd=open(argv[3],O_WRONLY | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
if (fd < 0)
{
printf("Ошибка открытия файла!!!\n");
exit(1);
}
dir=opendir(argv[1]);
if (dir != NULL)
{
while ((ent = readdir(dir)) != NULL)
{
strcpy(Name,"");
strcpy(Name,argv[1]);
strcpy(Name,strcat(Name,"/"));
strcpy(Name,strcat(Name,ent->d_name));
stat(Name,&st);
if (S_ISDIR(st.st_mode)==0)
{
size=size+st.st_size;
}
else
{
if ((strcmp(ent->d_name,".")!=0) && (strcmp(ent->d_name,"..")!=0))
{
id++;
pthread_create(&thread[id], NULL, pDir, (void *)Name);
}
if (threads==id)
{
for(i=1;i<=id;i++)
pthread_join(thread[i],NULL);
id=0;
}
}
}
if (id != 0)
{
for(i=1;i<=id;i++)
pthread_join(thread[i],NULL);
}
printf("Суммарный размер файлов в корневом каталоге %s %d байт‚\n",argv[1], size);
closedir(dir);
}
else
perror("Ошибка открытия каталога!!!");
if (close(fd) != 0)
{
printf("Ошибка закрытия файла!!!\n");
exit(1);
}
return 0;
}

3 Результаты выполнения программы


Литература
1. Хэвиленд К., Грэй Д., Салама Б. Системное программирование в UNIX: Руководство программиста по разработке ПО. –М.: ДМК «Пресс», 2000
2. Таненбаум, Э. Современные операционные системы/ Э. Таненбаум.– 2-е изд. – СПб. : Питер, 2002. – 1040 с.
3. Робачевский, А.М. Операционная система Unix/ А.М. Робачевский. – Спб. : BHV – Санкт-Петербург, 1997. – 528 с.
Категория: ОС | Добавил: Nintendo
Просмотров: 2131 | Загрузок: 75 | Комментарии: 1
Всего комментариев: 1
0  
1 Stella   (21.01.2012 14:48) [Материал]
спасибо

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]