Sunteți pe pagina 1din 6

Tema 2

Realizati un program C ce sa duplice un director


sursa(inclusiv subdirectoarele continute) intr-un
director destinatie, ambele nume de directoare vor fi
transmise ca si argumente din linia de comanda.
Programul va putea functiona in doua moduri:
1. Fisierele destinatie vor fi copii ale fisierelor destinatie.
2. Fisierele destinatie vor fi linkuri catre fisierele
destinatie.
Obs.
In cazul copierii fisierele destinatie vor avea aceleasi
drepturi de acces cu fisierele sursa.

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

DIR *v_dir_s, *v_dir_d;


struct dirent *v_dirent;
struct stat v_stat;
int status;
char sir_s[50],sir_d[50], *buf;

v_dirent = (struct dirent *)malloc(sizeof(struct dirent));


buf = (char *)malloc(50);
if(argc != 3)
{
printf("\n eroare, nu ati numarul suficient de
parametrii (1)");
exit(0);
}
v_dir_s = opendir(argv[1]);
readdir(v_dir_s);
readdir(v_dir_s);

v_dir_d = opendir(argv[2]);
if(!v_dir_d)
if(mkdir(argv[2], S_IRUSR | S_IWUSR |
S_IXUSR) != 0) printf("\nNu se poate crea directorul
destinatie ...");

while(v_dirent = readdir(v_dir_s))
{
sprintf(sir_s,"%s/%s",argv[1],v_dirent-
>d_name);
sprintf(sir_d,"%s/%s",argv[2],v_dirent-
>d_name);
if(link (sir_s, sir_d) != 0) {printf("\nA crapat
nesimtitu ...\n"); exit(0);}
}

/*
Se consideră un program C ce conţine două exit(0);
procese (părinte + fiu).
Procesul părinte va trimite, printr-un pipe, timp }
de 5s caracterul “a” către procesul fiu, în plus la else
fiecare secundă o să trimită semnalul SIGUSR1. {
Procesul fiu va citi caracterele din pipe şi va kill(fiu, SIGUSR1);
realiza o statistică ce va conţine numărul total de seconds++;
caractere, precum şi numărul de caractere primite alarm(1);
după fiecare semnal SIGUSR1. } }
La final statistica va fi trimisă printr-un pipe
procesului părinte ce o va afişa. int main()
*/ {
char buffer;
unsigned long total = 0, curent = 0, pas[5], poz = 0, int i;
seconds = 0; if (pipe(pfd) < 0)
int pfd[2], pfst[2]; {
pid_t fiu; perror("Eroare la pipe! \n");
exit(1);
void statistica() }
{
printf("Procesul fiu a primit semnalul if (pipe(pfst) < 0)
SIGUSR1.\n"); {
pas[poz] = curent; perror("Eroare la pipe!\n");
poz++; exit(1);
total += curent; }
curent = 0;
} if ((fiu = fork()) < 0)
{
void finalfiu() perror("Eroare la fork!\n");
{ exit(2);
int i; }
write(pfst[1], &total, sizeof(unsigned long));
if (fiu == 0)
for (i = 0; i < 5; i++) { {
write(pfst[1], &pas[i],
sizeof(unsigned long)); close(pfd[1]);
} close(pfst[0]);

close(pfst[1]); signal(SIGUSR1, statistica);


exit(0); signal(SIGUSR2, finalfiu);
} while (read(pfd[0], &buffer, 1) > 0)
curent++;
void alarma()
{ close(pfd[0]);
int i = 0; close(pfst[0]);
if (seconds == 5) exit(0);
{ }
kill(fiu, SIGUSR2);
read(pfst[0], &total, sizeof(unsigned else
long)); {
close(pfd[0]);
printf("Procesul fiu a terminat. Statistica:\n"); close(pfst[1]);
printf("Numarul total de caractere trimise: signal(SIGALRM, alarma);
%ld\n", total); alarm(1);
while (read(pfst[0], &pas[i], while (1)
sizeof(unsigned long)) > 0) write(pfd[1], "a", 1);
{ close(pfd[0]);
printf("Numarul de caractere la secunda %d : %ld\n", i close(pfst[1]);
+ 1, pas[i]); }
i++; return 0;
} }
close(pfst[0]);
. tema procese L2 }else printf("ceva2");
- se vor creea 3 procese (1 parinte + 2 fii);
- procesele fiu incep afisarea unul de la 0 celalat de la 9, while(1);
procesul parinte va }
afisa litere.
- la fiecare secunda procesul parinte trimite proceselor int main(){
fiu un semnal (ex. pid_t pid1,pid2;
SIGUSR1) ce va determina int k,status;
incrementarea/decrementarea valorii afisate de char c;
respectivul proces fiu(9 – decrementare, 0 -
incrementare). signal(SIGUSR1, SIG_IGN);
- Dupa 5 secunde de la inceperea rularii procesul
parinte incheie executia if( (pid1=fork())<0)
fiilor, le preia starea si isi incheie la randul lui executia. {
printf("\neroare la creare fiului 1");
int i=0,j=9; exit(0);
}
void fiu1_increment(int sig) if(pid1==0)
{ {
i++; proces_fiu1();
printf("%dtest",i); exit(0);
signal(SIGUSR1, fiu1_increment); }
} if( (pid2=fork())<0)
{
void proces_fiu1() printf("\neroare la creare fiului 2");
{ exit(0);
if (signal(SIGINT, SIG_IGN) == SIG_ERR) }
{ if(pid2==0)
printf("Error ignoring SIGINT in process b\n"); {
exit(3); proces_fiu2();
} exit(0);
}
if(signal(SIGUSR1, fiu1_increment)== SIG_ERR)
{ for(k=0;k<5;k++)
printf("eroare de semnal\n"); {
exit(1); sleep(1);
} if(kill(pid1, SIGUSR1)==-1) printf("\no crapat");
while(1); if(kill(pid2, SIGUSR1)==-1) printf("\no crapat al 2-lea");
} }
kill(pid1, SIGTERM);
void fiu2_decrement(int sig) kill(pid2, SIGTERM);
{ wait(&status);
j--; wait(&status);
printf("%d",j); return 0;
signal(SIGUSR1, fiu2_decrement); }
}
-------------------------------------------------
void proces_fiu2()
{
int i;
if(signal(SIGUSR2, fiu2_decrement)== SIG_ERR)
{
printf("eroare de semnal\n");
exit(1);
/*.Problema – pipe while( ( read(file,&pfd[1],30) )!=0)
{
Sa se scrie un program C ce contine doua procese }
(parinte + fiu). Procesul parinte citeste close(pfd[1]);
un fisier text ce contine cifre, litere mari, litere mici si il //wait(&status);
trimite printr-un pipe procesului return 0; }
fiu. Procesul fiu realizeaza o statistica cu numarul de
caractere primite din fiecare 10.Problema Procese
categorie (cifre, litere mari, litere mici) si la final va
afisa statistica respectiva. Să se realizeze un program in C care să creeze trei
procese (inclusive părintele). Fiecare proces îsi afisează
PID-ul, primul proces fiu numără de la 1-50000, al
int main(int argc,char *argv[]){ doilea proces fiu de la 50000-100000, iar procesul
pid_t pid1; parinte afisează literele din alfabet in mod continuu
int i,contor_digit=0,contor_low=0,contor_up=0,status,file; pana cand ambele procese fiu isi incheie executia,
char buffer[30]; moment in care la randul lui isi va incheia executia.
int pfd[2]; */
int main(){
if(argc!=2) pid_t pid1,pid2;
{ int i,status;
printf("\nNr insuficient de parametrii"); char c;
}
if( (pid1=fork())<0)
if(pipe(pfd)==-1) {
{printf("\neroare la pipe"); exit(0);} printf("\neroare la creare fiului 1");
/* exit(0);
if( (pid1=fork())<0) }
{ if(pid1==0)
printf("\neroare la creare fiului 1"); {
exit(0); printf("\npid-ul 1: %d", getpid());
} for(i=1;i<50000;i++){}
if(pid1==0) exit(0);
{ }
close(pfd[1]); if( (pid2=fork())<0)
while( ( read(pfd[0],buffer,30) )!=0) {
{ printf("\neroare la creare fiului 2");
for(i=0;i<30;i++) exit(0);
{ }
if(isdigit(buffer[i])) contor_digit++; if(pid2==0)
if(isupper(buffer[i])) contor_up++; {
if(islower(buffer[i])) contor_low++; printf("\npid-ul 2: %d", getpid());
} for(i=50000;i<100000;i++){}
} exit(0);
printf("\ncifre: %d", contor_digit); }
printf("\nlitere mari: %d", contor_up); printf("\n");
printf("\nlitere mici: %d", contor_low); for(c='a';c<='z';c++)
close(pfd[0]); {
exit(0); printf("%c ",c);
} if(c=='z') c='a';
*/ if(wait(&status)==-1) printf("\n eroare la wait");
printf("vest"); if(wait(&status)==-1) printf("\n eroare la wait");
file=open(argv[1],O_RDONLY); else exit(0);
close(pfd[0]); }
printf("%d",file); return 0;}
if(pid == 0){
Tema Procese close(pfdPF[1]);
close(pfdFP[0]);
Se considera un program C ce contine doua procese if(signal(SIGUSR1,tratare_semnal) ==
(parinte + fiu). Procesul parinte va SIG_ERR) { printf("\nEroare la signal"); exit(0); }
trimite, printr-un pipe, timp de 5s caracterul “a” catre while(read(pfdPF[0],&a,1)){
procesul fiu, in plus la fiecare contor++;
secunda o sa trimita semnalul SIGUSR1. Procesul fiu va }
citi caracterele din pipe si va close(pfdPF[0]);
realiza o statistica ce va contine numarul total de write(pfdFP[1], &contor, sizeof(contor));
caractere, precum si numarul de write(pfdFP[1], contor_sig, sizeof(contor_sig));
caractere primite dupa fiecare semnal SIGUSR1. La close(pfdFP[1]);
final statistica va fi trimisa printr-un exit(0);
pipe procesului parinte ce o va afisa. }
*/
int contor = 0, contor_sig[5], i=0, pid, sec = 0; close(pfdPF[0]);
close(pfdFP[1]);
void tratare_semnal(int sig){
if(i>0) contor_sig[i++] = contor - contor_sig[i-1]; alarm(1);
else contor_sig[i++] = contor; sec++;
if(signal(SIGUSR1,tratare_semnal) == SIG_ERR) { if(signal(SIGALRM,tratare_alarm) == SIG_ERR) {
printf("\nEroare la signal"); exit(0); } printf("\nEroare la alarm"); exit(0); }
} for(;sec<5;) write(pfdPF[1], &a, 1);

void tratare_alarm(int sig){ close(pfdPF[1]);


kill(pid,SIGUSR1);
alarm(1); read(pfdFP[0], &contor, sizeof(contor));
sec++; read(pfdFP[0], contor_sig, sizeof(contor_sig));
if(signal(SIGALRM,tratare_alarm) == SIG_ERR) { printf("\nContor total: %d \nContor SIGUSR1: ", contor);
printf("\nEroare la alarm"); exit(0); } for(i=0;i<=5;i++) printf("%d ", contor_sig[i]);
} printf("\n");
wait(&status);
int main(){ }

int i, pfdPF[2], pfdFP[2], status;


char a = 'a';

for(i=0;i<5;i++) contor_sig[i] = 0; //punem pe 0 toate


contoarele

if(pipe(pfdPF) == -1){
printf("\nEroare la crearea pipe-ului PF...");
exit(0);
}
if(pipe(pfdFP) == -1){
printf("\nEroare la crearea pipe-ului FP...");
exit(0);
}

if((pid=fork()) == -1){
printf("\nEroare la crearea fiului...");
exit(0);
}
exit(0);
}
Semanle void ProcessFiu()
{
struct sigaction act,old;
void SetAlarm(int sig)
{
act.sa_handler=SIG_IGN;
printf("Alarma!!\n");
if(sigaction(SIGTERM,&act,&old)!=0)
kill(chld_pid,SIGUSR1);
{
}
printf("Error ignoring SIGTERM in process fiu\n");
void ProcessFiuEnds();
exit(0);
void ProcessParinte()
{
}
struct sigaction act,old;
act.sa_handler=&terminare;
if(sigaction(SIGUSR1,&act,&old)!=0)
act.sa_handler=&SetAlarm;
{
if(sigaction(SIGALRM,&act,&old)!=0)
printf("Error setting handler for SIGUSR1\n");
{
exit(0);
printf("Error setting handler for SIGALRM in parinte\n");
}
exit(0);
while(1)
}
printf("B");
act.sa_handler=&ProcessFiuEnds;
}
if(sigaction(SIGCHLD,&act,&old)!=0)
int main()
{
{
printf("Error setting handler for SIGCHLD in parinte\n");
struct sigaction act,old;
exit(0);
errno=0;
}
if((chld_pid=fork())<0)
alarm(7);
{
while(1)
printf("Error %d:\"%s\" creating child
printf("A");
process\n",errno,strerror(errno));
exit(0);
}
}
void terminare(int sig)
if(chld_pid==0)
{
{
printf("Fiul a primit semnalul SIGUSR1! Process fiu
ProcessFiu();
ends\n");
exit(0);
exit(0);
}
}
else
{
void ProcessFiuEnds()
ProcessParinte();
{
}
int status;
return 0;
wait(&status);
}

S-ar putea să vă placă și