Pablo Morales P1 #!/bin/bash nclass=*.class .o /* seguramente quiso decir *.class solamente */ no=*.o rm -f `find $1 -name "$no $nclass"` /* no funciona, rm se confundirá con los espacios */ 15/25 P2 #include <stdio.h> #include <stdlib.h> #include <signal.h> static void atender(int); int main(void) { if (signal(SIGINT, atender) == SIG_ERR) printf("No se puede atrapar SIGINT"); printf("Esperando alguna señal...\n"); for(;;) pause(); } static void atender(int signo) { if(signo == SIGINT) { sleep(2); printf("\nLlegó Control-C\n"); exit(0); } } 25/25 P3 #include <unistd.h> #include <stdio.h> #include <stdlib.h> int main(void) { pid_t pid; int pfd[2], status; FILE *pf, *sdw, *sdr; char op[128]; char resultado[128]; /* if ((pf = popen("bc", "w")) == NULL){ // OJO esto pudo servir perror("popen"); exit(1); } */ if (pipe(pfd) < 0) { perror("pipe"); exit(1); } if ((pid = fork()) < 0) { perror("fork"); exit(1); } if (pid == 0) { dup2(pfd[0], 0); // Ud. hace un loop entre la entrada y salida del hijo ¿? dup2(pfd[1], 1); execl("/usr/bin/bc", "bc", (char *)0); perror("exec"); _exit(127); } sdw = fdopen(pfd[1], "w"); sdr = fdopen(pfd[0], "r"); while(strcmp(op,"quit")!=0) // bien la idea, le faltó una pipa { scanf("%s",op); fprintf(sdw,"%s\n", op); fflush(sdw); fscanf(sdr,"%s", resultado); printf("%s\n", resultado); } fprintf(sdw,"quit\n"); fflush(sdw); close(pfd[1]); close(pfd[0]); waitpid(pid, &status, 0); return 0; } 22/25 P4 #include <pthread.h> #include <stdlib.h> #include <stdio.h> #define IT 2000000 int contador =0; pthread_mutex_t mylock = PTHREAD_MUTEX_INITIALIZER; void *incrementa1(int *max) { int i; for(i=0; i < IT; i++) { contador++; if(contador > *max) *max = contador; } return (NULL); } void decrementa1(int *min) { int i; for(i=0; i < IT; i++) { contador--; if(contador < *min) *min = contador; } } void *incrementa(int *max) { int i; for(i=0; i < IT; i++) { pthread_mutex_lock(&mylock); contador++; if(contador > *max) *max = contador; pthread_mutex_unlock(&mylock); } return (NULL); } void decrementa(int *min) { int i; for(i=0; i < IT; i++) { pthread_mutex_lock(&mylock); contador--; if(contador < *min) *min = contador; pthread_mutex_lock(&mylock); } } int main(int argc, char **argv) { int err, i, flag=0, *min, *max; // *min *max no tienen espacio asigado, pudo ser min y max. contador = 0; pthread_t tid; if(argc == 2) flag = atoi(argv[1]); else printf("Faltan argumentos.\n"); if(flag == 1) // Con exclusion mutua { if( pthread_create(&tid, NULL, incrementa, (void *)max)) // debió usar &max { printf("Error: No se pudo crear la hebra.\n"); exit(0); } decrementa(min); } else // Sin exclusion mutua { if( pthread_create(&tid, NULL, incrementa1, (void *)max)) { printf("Error: No se pudo crear la hebra.\n"); exit(0); } decrementa1(min); } printf("El minimo valor alcanzado es: %d\n", *min); printf("El maximo valor alcanzado es: %d\n", *max); printf("El valor final es: %d\n", contador); } 23/25