#include #include #include #include #include #include #include #include #include #include #define IFERROR(s,m) if((s)==-1) {perror(m); exit(errno);} int flog; char buffer[40]="esecuzione terminata con successo\n"; void cHandler(int); void cercafile(char *ext) { DIR * dir; struct dirent *file; char new_ext[100], buf_son[200]; int lung, ll, count; sprintf(new_ext,".%s",ext); lung = strlen(new_ext); count = 0; dir = opendir("."); while((file = readdir(dir))!= NULL) { if((strcmp(file->d_name,".")!=0) && (strcmp(file->d_name,"..")!=0)) { ll = strlen(file->d_name)-lung; if(strcmp((file->d_name)+ll,new_ext)==0) count++; } } closedir(dir); sprintf(buf_son,"file con estensione %s: %d\n",ext,count); IFERROR(write(flog,buf_son,strlen(buf_son)),"write finale"); } int main(int argc, char *argv[]) { int i, pid, status; if(argc<3) { printf("Uso: report dir ext1 ext2 ... extn\n"); exit(0); } signal(SIGINT, cHandler); IFERROR(flog = open("log", O_WRONLY|O_CREAT|O_TRUNC, 0644),"aprendo report"); chdir(argv[1]); for(i=2 ; i< argc ; i++) { pid = fork(); if(pid==0){ signal(SIGINT,SIG_IGN); cercafile(argv[i]); exit(0); } } for(i=2 ; i< argc ; i++) { wait(&status); } IFERROR(write(flog,buffer,strlen(buffer)),"write finale"); IFERROR(close(flog),"chiudendo report"); return(0); } void cHandler(int id_segnale) { sprintf(buffer,"esecuzione terminata con Control-c\n"); IFERROR(write(flog,buffer,strlen(buffer)),"write da signal"); kill(0,SIGKILL); exit(0); }