Laborator 12

Test procese&semnale

Observatie: Rezolvarea a fost facuta in maniera secventiala.

/*Sa se scrie un program C care primeste ca argument un fisier.

Programul va parcurge fisierul primit. Are o cale catre director pe fiecare linie

Pentru fiecare director, va crea un proces, care va parcurge recursiv directorul.

Pentru fiecare fisier normal gasit in director, va apela un al doilea program.(C/shell)

Acesta va afisa permisiunile pentru acel fisier.

Parintele va numara cate permisiuni sunt din fiecare in total, de la toate fisierele.(se va folosi pipe)

Cand se intalneste o legatura simbolica, parintele va fi informat, cu un semnal SIGUSR1. Parintele va contoriza cate legaturi

au fost gasite.(Parintele va prelua cu SIGCHAR)

La final de executie, parintele va afisa doua linii: numar permisiuni, numar legaturi simbolice

*/

#include <stdlib.h>

#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <errno.h>

#include <unistd.h>

#include <dirent.h>

#include <string.h>

void myError(char *msg){

printf("Eroare: %s",msg);

exit(errno);

}

int numarPermisiuni=0;

int numarLegaturi=0;

void readDir(char *buf){

DIR *dir;

struct stat sb;

struct dirent *dirp;

if((dir=opendir(buf))==NULL){

myError("Eroare la deschiderea directorului");

}

while((dirp=readdir(dir))!=NULL){

if(strcmp(dirp->d_name,".")==0 || strcmp(dirp->d_name,"..")==0){

continue;

}

char path[500];

strcpy(path,buf);

strcat(path,"/");

strcat(path,dirp->d_name);

if((stat(path,&sb))==-1){

myError("Eroare la stat");

}

if(S_ISDIR(sb.st_mode)){

readDir(path);

}

if(S_ISLNK(sb.st_mode)){

numarLegaturi++;

}

if(S_ISREG(sb.st_mode)){

if(S_IRUSR&sb.st_mode){

printf("%s :Owner has read permisions\n",path);

numarPermisiuni++;

}

if(S_IWUSR&sb.st_mode){

printf("%s :Owner has write permisions\n",path);

numarPermisiuni++;

}

if(S_IXUSR&sb.st_mode){

printf("%s :Owner has execute permisions\n",path);

numarPermisiuni++;

}

}

}

}

int main(int argc, char* argv[])

{

if(argc!=2){

myError("Trebuie un sigur argument");

}

int fd;

if((fd=open(argv[1],O_RDONLY))==-1){

myError("Nu am putut deschide fisierul de intrare");

}

FILE *inputFile;

if((inputFile=fdopen(fd,"r"))==NULL){

myError("Fisier de intrare din nou");

}

while(!feof(inputFile)){

char buf[256];

if(!fscanf(inputFile,"%s",buf)){

myError("Eroare la citire din fisier");

}

readDir(buf);

}

printf("Numar permisiuni: %d\n",numarPermisiuni);

printf("Numar legaturi simbolice: %d\n",numarLegaturi);

return 0;

}