Danilo Bize P1 #!/bin/bash #ls -l | awk {'print $8 $9'} | find .txt /* Ojo esta línea está comentada */ rm -f 'find $1 -name *.class *.o*' Este comando es justamente el que no funciona, según se dice en pregunta. 03/25 P2 /* Avisa SIGINT: generada con DELETE o Control-C define SIGINT 2 /* Interrupt (ANSI). Ignora SIGUSR1: Es una señal definida por el usuario para ser usada en programas de aplicación. #define SIGUSR1 10 User-defined signal 1 (POSIX). */ #include <signal.h> #include <stdio.h> #include <stdlib.h> static void sig_usr(int); void err_sys(char * msg) { printf("%s \n", msg); exit(-1); } int main(void) { if (signal(SIGUSR1, sig_usr) == SIG_ERR) err_sys("SIG_ERR"); if (signal(SIGUSR2, sig_usr) == SIG_ERR) err_sys("SIG_ERR"); for ( ; ; ) pause(); } static void sig_usr(int signo) { if (signo == SIGINT) { printf("Llegó Control-C.\n"); exit(1); } else err_sys("received unexpected signal"); return; } /* Usted no configura la ateción de SIGINT. No tiene cómo llegar a sig_usr con Control-C. Tampoco espera 2 segundos. Su programa termina tan pronto llega Control-C*/ 12/25 P3 #include <sys/types.h> #include <unistd.h> #include <stdio.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> int main(void){ FILE * sd; int pfd[2],pfd2[2], n; char buf[1024];//tamaño de la operacion aritmetica maxima char line[64];//tamaño del resultado mas grande posible pid_t pid; // Crea la pipa. if(pipe(pfd) < 0){ perror("pipe"); exit(1); } // Crea hijo if ((pid = fork()) < 0) { perror("fork"); exit(1); } //Proceso hijo if (pid == 0) { dup2(pfd[1], 1); //Salida estandar a la pica close(pfd[0]); } close(pfd[1]);// no se escribe en esta pipa dup2(pfd2[0],0); // Redirige la salida de la pipa a la entrada estandar. sd = fdopen(pfd2[1], "w"); // Asocia la entrada de la pipa con el archivo 'sd'. while ((n = read(0, buf, sizeof(buf))) > 0) { if(n>3){ if((buf[0]=="q")&&(buf[1]=="u")&&(buf[2]=="i")&&(buf[3]=="t")) { printf("bye\n"); fprintf(sd, "%s | bc\n",buf); getchar(); exit(0); } } else { fprintf(sd, "%s | bc\n",buf); if (read(pfd[0], line, 3) < 0) { perror("read"); exit(1); } printf(line); } } fflush(sd); fclose(sd); close(pfd[0]); waitpid(pid, &status, 0); exit(0); } /* Hay varios problemas: buf[0] es char, debió compararse con 'q'. Usted no declara status. Usa dos pipas, pero crea sólo una. El proceso hijo hace casi lo mismo que el padre. 4/25 P4 #include <stdio.h> #include <pthread.h> #define NTHREADS 2 void *thread_function1(void *); void *thread_function0(void *); pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER; int counter1 = 0; int counter0 = 0; int max_counter0 = 0; int main() { // No lee argumentos pthread_t thread_id[NTHREADS]; int i, j; for(i=0; i < NTHREADS; i++) { if(==1){ // Expreción errada pthread_create( &thread_id[i], NULL, thread_function1, NULL ); } else if(==0) { pthread_create( &thread_id[i], NULL, thread_function0, NULL ); } else printf("NO HAY ARGUMENTOS"); getc(); exit(-1); } for(j=0; j < NTHREADS; j++) { pthread_join( thread_id[j], NULL); } printf("Valor final del counter 1 es : %d\n", counter1); printf("Valor maximo del counter 0 es: %d\n", max_counter0); } void *thread_function1(void *dummyPtr) { printf("Thread n° %ld\n", pthread_self()); pthread_mutex_lock( &mutex1 ); // limita concurrencia int i; for(i=0;i<2000000;i++){counter1++;} pthread_mutex_unlock( &mutex1 ); } void *thread_function0(void *dummyPtr){ printf("Thread n° %ld\n", pthread_self()); int i, aux; for(i=0;i<2000000;i++){ aux=counter0; counter0++; if(aux>max_counter0) { max_counter0 = aux;} } } /* Para compilar: cc -lpthread testHilos.c Para correr: ./a.out */ /* Nadie decrementa el contador !!! */ 15/25