ProvaPratica 2055.02.10
Revision as of 16:44, 9 April 2014 by Mrta (talk | contribs) (Mrta moved page ProvaPratica 2015.02.10 to ProvaPratica 2055.02.10)
Esercizio 1
In una rete token-ring, i nodi sono organizzati ad anello e si scambiano un “token” che passa da un nodo al successivo.
Quando un processo riceve il token:
● stampa “pid: ho ricevuto il token”
● attende 1 secondo
● stampa “pid: spedisco il token al processo x”
● spedisce il token al processo x
dove pid è l'identificatore del processo che stampa, e x è l'identificatore del processo successivo.
Scrivere un programma che genera N processi che comunicano tramite "token-ring". Viene lasciata allo studente la scelta
del meccanismo di sincronizzazione/comunicazione (ma vedi punto 2).
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
static int token=42;
int main(int argc, char *argv[])
{
int i;
int n=atoi(argv[1]);
char *s;
pid_t firstproc,nextproc,newproc;
firstproc=newproc=fork();
nextproc=0;
for (i=0; i<n; i++) {
if (newproc==0) {
int fdin, fdout;
//nextproc e' il successivo
if (nextproc != 0) {
asprintf(&s,"/tmp/np%03d",nextproc);
mknod(s,S_IFIFO | 0644, 0);
fdout=open(s,O_WRONLY);
free(s);
asprintf(&s,"/tmp/np%03d",getpid());
mknod(s,S_IFIFO | 0644, 0);
fdin=open(s,O_RDONLY);
free(s);
} else {
asprintf(&s,"/tmp/np%03d",getpid());
mknod(s,S_IFIFO | 0644, 0);
fdin=open(s,O_RDONLY);
free(s);
read(fdin,&nextproc,sizeof(nextproc));
asprintf(&s,"/tmp/np%03d",nextproc);
mknod(s,S_IFIFO | 0644, 0);
fdout=open(s,O_WRONLY);
free(s);
write(fdout, &token, sizeof(token));
}
while (1) {
int buf;
read(fdin, &buf, sizeof(buf));
printf("%d ricevuto il token\n",getpid());
sleep(1);
printf("%d spedisco il token a %d\n",getpid(),nextproc);
write(fdout, &token, sizeof(token));
}
exit(0);
}
nextproc=newproc;
if (i<n-1) newproc=fork();
}
int fdout;
asprintf(&s,"/tmp/np%03d",nextproc);
mknod(s,S_IFIFO | 0644, 0);
fdout=open(s,O_WRONLY);
free(s);
write(fdout, &firstproc, sizeof(firstproc));
close(fdout);
for (i=0; i<n; i++) {
int status;
wait(&status);
}
}