Documente Academic
Documente Profesional
Documente Cultură
*/
int main(int argc, char *argv[]){
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]);
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);
}