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

КР по ОС Вариант №15

.docx
Скачиваний:
32
Добавлен:
01.04.2014
Размер:
236.8 Кб
Скачать

Содержание

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 с.