Содержание 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 с.