ELO330: Programación de Sistemas:Certamen Parcial 29/09/2006

Anuncio
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));
}
}
}
}
Descargar