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

Лаба 4 Вариант 4

.c
Скачиваний:
13
Добавлен:
01.04.2014
Размер:
3.78 Кб
Скачать
/*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 ;
}