ELO330: Progr a m ación d e Siste m a s:Cer ta m e n Parcial 29 /09 / 2006 Certam en Parcial 9 0 minut o s. Tod a s las p r eg u n t a s tie ne n igual p u n t aje. 1. - Desar r olle el p r ogr a m a p r o teja.s h dir p e r mis oDir p e r mis oFile. Éste es u n s h ell o scrip t q u e p e r mi te ca m biar los p e r mis o s d e dir y t o d o s los s u b directorios d el s u b á r b ol co n r aí z e n dir a p e r mis oDir y d e los arc hivo s b ajo es te s u b á r bol a p e r mis oFile. Por eje m plo, p a r a p r o t eger t o d o s los a rc hivos d e mi cue n t a p u e d o h acer: % cd # para quedar en ho me % p r o t eja.s h . 7 0 0 6 0 0 # y luego % p r o t eja.s h WWW 7 1 1 6 4 4 # p a r a d a r acceso a mi web. #! /bin/bash #scan directory recursively and change the diretory's permission # under $1 to $2 and all the file's to $3 dir=$1 perD=$2 perF=$3 echo .... scanning directory $dir chmod $perD $dir for i in $dir/* do if test ­d $i then $0 $i $perD $perF else echo ".... changing file $i" chmod $perF $i fi done Permisos Directorios: 10 pts (incluido el raíz) Permisos archivos: 10 pts. Trabajo en sub­árboles: 10 pts. Estructuras de control: 3 pts. 2. - Desar r olle el p r ogr a m a alar m a.c. Este p r ogr a m a se cor r e co m o: % alar m a mi n u t o s Do n d e mi n u t o s es u n e n te r o n o n ega tivo. Al co r rer el p r ogr a m a re t o r n a al p r o m p t d el sis te m a in me diat a m e n t e, p e r o cua n d o h a p a s a d o el n ú m e r o d e mi n u t o s in dica d o s, e n la p a n t alla a p a rece p o r 5 s eg u n d o s el r eloj d el co m a n d o xclock. ELO330: Progr a m ación d e Siste m a s:Cer ta m e n Parcial Por Por Por Por 29 /09 / 2006 r et o r n a r p r o n t: 1 0 p t s. es p e r a r el n ú m e r o d e mi n u t o s : 8 p t s. ejecu t a r xclock: 7 p t s. es p e r a r 5 seg. y te r mi na r xclock: 8 p t s. #include <sys/types.h> #include <sys/wait.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char * argv[]) { pid_t pid, pid2generation; if ( (pid = fork()) < 0) perror("fork error in parent"); else if (pid != 0) /* parent process*/ exit(0); /* this way the prompt comes back */ /* the child process is adopted by init */ /*child process*/ sleep(60*atoi(argv[1])); /* wait for N second */ if ( (pid2generation=fork()) <0 ) /*prepare to lunch xclock */ perror("fork error in child"); else if (pid2generation==0) /* grandchild process*/ if (execlp("xclock", "xclock",(char *) 0) < 0) perror("execlp error"); /* this is the child again */ sleep(5); /* wait for 5 second */ kill(pid2generation, SIGKILL); /* close xclock */ if (waitpid(pid2generation, NULL, 0) < 0) perror("wait error"); } 3. - To d o in dica q ue el cor ta f uegos e n t re la re d local d el labor a t o rio d e Electr ó nica y la r e d d e los p r ofes o re s n o p e r mite el p a s o d el t r áfico m ul tica s t. Para s u p e r a r es ta sit uació n y s a bien d o q ue Aragor n tie ne u n a t a rjet a d e re d con IP 1 7 2.16.0.4 y o t r a co n IP 2 0 0.1.17.195, a u s te d se le pi d e h acer u n p r ogr a m a q ue cor rie n d o e n a r agor n t o m e el t r áfico d el gr u p o m ul tica s t 2 3 4.5.5.5, p u e r t o 1 2 3 4, d e u n la do d e la re d y lo e nvíe al ot r o y vicever s a. Por Por Por Por creación d e s ocket s: 5 p t s. bi n d d e s ocke t s: 6 p t s. m e m b r e sía d e a m b o s s ocke t s: 6 p t s. m a n ejo d e vecto r d e d e sc rip t o re s 5 p t s. ELO330: Progr a m ación d e Siste m a s:Cer ta m e n Parcial 29 /09 / 2006 Por m a n ejo d e select: 5 p t s. Por r e - e nvío: 6 p t s. #include <netinet/in.h> #include <sys/types.h> #include <sys/socket.h> #include <string.h> #define LENGTH 1000 int main( int argc, char * argv[] ) { int s_private, s_valid; struct sockaddr_in mc_group; int length; char buffer[LENGTH]; int rc, n; struct ip_mreq mreq; /* multicast group info structure */ char ttl; fd_set readfds, readfdsCopy; s_private = socket (AF_INET,SOCK_DGRAM,0); s_valid = socket (AF_INET,SOCK_DGRAM,0); mc_group.sin_family = AF_INET; mc_group.sin_addr.s_addr = inet_addr("172.16.0.4"); mc_group.sin_port = htons(1234); bind( s_private, (struct sockaddr *)&mc_group, sizeof(mc_group)); mc_group.sin_addr.s_addr = inet_addr("200.1.17.195"); bind( s_valid, (struct sockaddr *)&mc_group, sizeof(mc_group)); mreq.imr_multiaddr.s_addr = inet_addr("234.5.5.5"); mreq.imr_interface.s_addr = inet_addr("172.16.0.4"); setsockopt(s_private,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char *) &mreq, sizeof(mreq)); mreq.imr_interface.s_addr = inet_addr("200.1.17.195"); setsockopt(s_valid,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char *) &mreq, sizeof(mreq)); ttl = 2; setsockopt(s_private ,IPPROTO_IP,IP_MULTICAST_TTL,(char *) &ttl, sizeof(u_char)); setsockopt(s_valid ,IPPROTO_IP,IP_MULTICAST_TTL,(char *) &ttl, sizeof(u_char)); mc_group.sin_addr.s_addr= inet_addr("234.5.5.5"); FD_ZERO(&readfdsCopy); FD_SET(s_private,&readfdsCopy); FD_SET(s_valid,&readfdsCopy); for(;;){ memcpy(&readfds, &readfdsCopy, sizeof(fd_set)); ELO330: Progr a m ación d e Siste m a s:Cer ta m e n Parcial 29 /09 / 2006 n = select(FD_SETSIZE, &readfds, (fd_set *) 0, (fd_set *) 0, NULL); if (n > 0) { if (FD_ISSET(s_private, &readfds)) { rc=recv(s_private, (char *)&buffer, sizeof(buffer), 0); sendto(s_valid, (char *)&buffer, rc, 0, (struct sockaddr*)&mc_group, sizeof(mc_group)); } if (FD_ISSET(s_valid, &readfds)) { rc=recv(s_valid, (char *)&buffer, sizeof(buffer), 0); sendto(s_private, (char *)&buffer, rc, 0, (struct sockaddr*)&mc_group, sizeof(mc_group)); } } } }