Добавил:
inrad
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лаба 4 Вариант 4
.c/*1.Написать программу поиска одинаковых по их содержимому файлов в двух каталогов, например, Dir1 и Dir2. Пользователь задаёт имена Dir1 и Dir2. В результате работы программы файлы, имеющиеся в Dir1, сравниваются с файлами в Dir2 по их содержимому. Процедуры сравнения должны запускаться с использованием функции fork() в отдельном процессе для каждой пары сравниваемых файлов. Каждый процесс выводит на экран свой pid, имя файла, число просмотренных байт и результаты сравнения. Число запущенных процессов не должно превышать N (вводится пользователем).*/
#include <sys/time.h>
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#include <unistd.h>
char way1[100] , par1[100] ;
char way2[100] , par2[100] ;
int flag = 0 ;
int number ;
int n =0 ; pid_t pid,pidt,pidm,temp;
int sravn ( char w[100] , char w2[100] ,int pid)
{
char ch1 , ch2;
printf ("%s ******** %s\n",w,w2);
printf ("Number of processes: %d \n",n);
struct stat buf;
stat(w , &buf);
//if (!strcmp(w,w2)) return 0;
FILE *file1 = fopen(w , "r");
FILE *file2 = fopen(w2 , "r");
if ( file1 == NULL ) { fprintf(stderr , "[%d] ERROR opening file1 %s \n" ,getpid() ,w); exit (1) ; }
if ( file2 == NULL ) { fprintf(stderr , "[%d] ERROR opening file2 %s \n" ,getpid() ,w2 ); exit (1); }
while ( !feof(file1) && !feof (file2) )
{
ch1= fgetc(file1);
ch2= fgetc(file2);
// printf("%c - %c\n" ,ch1 , ch2 );
if ( ch1!=ch2 )
{
// printf("ok\n");
printf("%d : %s != %s \n" ,getpid(), w , w2 );
fclose(file1);
fclose(file2);
exit (1) ;
}
}
printf("%d : %s == %s - %i byte \n" ,getpid(), w , w2 , buf.st_size );
//flag =1 ;
fclose(file1);
fclose(file2);
exit (0);
}
void count2( DIR *dp2 ,char *way)
{
struct dirent *d;
char ch[200];
printf("way2 -- %s \n" ,way);
do
{
d=readdir(dp2);
if (d && (d->d_name)[0]!='.' && d->d_type==DT_REG )
{
strcpy(ch,way);
strcat(ch,"/");
strcat(ch,d->d_name);
strcpy(way2,ch);
pidt = getpid();
if (pidt == pidm)
{
if (n < number)
{
n++;
pid = fork () ;
if (pid == 0)
{printf("[way2] -- %s \n" ,way);sravn(way1 , ch ,pid);}
}
else if (n == number)
{
//printf("--%d--");
temp = wait();
//printf("--%d--\n",temp);
if (temp > 0)
{
printf("[%d]\n",temp);
pid = fork();
if (pid == 0)
{printf ("pid === %d\n",pid);sravn(way1 , ch ,pid);}
}
}
//}
}
}
//else printf ("%d %d!!!!!!!!!!\n",d2,d2->d_type);
}
while(d);
}
void count( DIR *dp2 , char *way )
{
struct dirent *d;
char ch[100];
printf("way1 ---%s\n",way);
do
{
d=readdir(dp2);
if (d && (d->d_name)[0] != '.' && (d->d_type==DT_REG))
{
strcpy(ch,way);
strcat(ch,"/");
strcat(ch,d->d_name);
strcpy(way1,ch);
//printf("way2 ---%s\n",par2);
count2( opendir(par2) , par2);
}
}
while(d);
}
int main (int argc , char* argv[])
{
if ( argc<2 ) { fprintf(stderr , "ERROR!! More parametres... %s\n" , argv[0]); return(0); }
DIR *dp;
printf("Hello\n");
strcpy(par1,argv[1]);
strcpy(par2,argv[2]);
number = atoi (argv[3]) ;
pidm = getpid();
printf ("Parent: %d\n",pidm);
dp=opendir( par1 );
count(dp , par1);
//if (!flag) printf ("Not found\n");
return 0 ;
}
Соседние файлы в предмете Операционные системы