ProvaPratica 2055.02.10

From Sistemi Operativi
Jump to navigation Jump to search

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