Difference between revisions of "25.09.2015 esercizio 1"

From Sistemi Operativi
Jump to navigation Jump to search
(Created page with "<source lang="text"> Scrivere un programma che preso come parametro un file contenente un elenco di comandi (con I relativi parametri) li attivi tutti in esecuzione concorre...")
 
(Blanked the page)
 
Line 1: Line 1:
−
<source lang="text">
 
−
Scrivere un programma che preso come parametro un file contenente un elenco di comandi (con I relativi parametri) li attivi
 
−
tutti in esecuzione concorrente e rimanga in attesa. Quando il primo termina, vengono terminati (con segnale SIGTERM) tutti
 
−
gli altri. (consiglio: puo' essere utile usare la mia libreria s2argv-execs)
 
−
esempio:
 
−
wta commands
 
  
−
il file commands contiene:
 
−
./ttest 40
 
−
./ttest 10
 
−
./ttest 20
 
−
 
−
lo script ./ttest contiene:
 
−
#!/bin/bash
 
−
echo waiting for $1 seconds
 
−
sleep $1
 
−
echo done $1
 
−
 
−
l'ouptut sara':
 
−
waiting for 40 seconds
 
−
waiting for 10 seconds
 
−
waiting for 20 seconds
 
−
done 10
 
−
 
−
e poi basta perche' gli altri processi verranno terminati.
 
−
</source>
 
−
== Possibile soluzione ==
 
−
<source lang="c">
 
−
#include <stdio.h>
 
−
#include <stdlib.h>
 
−
#include <errno.h>
 
−
#include <unistd.h>
 
−
#include <s2argv.h>
 
−
#include <sys/types.h>
 
−
#include <signal.h>
 
−
 
−
#define MAX 20
 
−
 
−
int contaRighe (FILE *A){
 
−
char *a;
 
−
int i=0;
 
−
a= malloc (MAX*sizeof(char));
 
−
 
−
if (a==NULL) {
 
−
perror ("malloc");
 
−
return -1;
 
−
}
 
−
 
−
while (fgets(a, MAX, A)){
 
−
if (*a==EOF || *a=='\n') break;
 
−
i++;
 
−
}
 
−
 
−
return i;
 
−
}
 
−
 
−
 
−
int main (int argc, char *argv []){
 
−
int status;
 
−
int i=0;
 
−
int j=0;
 
−
int z=0; /*indice per ampiezza "pid_t ID" e "char *comando"*/
 
−
char *comando[z];
 
−
pid_t ID [z];  /* memorizza i pid di tutti i processi attivati */
 
−
pid_t terminato;  /* memorizza il pid del primo processo che termina*/
 
−
 
−
FILE *fd = fopen (argv[1], "r");
 
−
 
−
if( fd==NULL ) {
 
−
    perror("Errore in apertura del file");
 
−
    return -1;
 
−
  }
 
−
 
−
j=contaRighe (fd); /*ritorna il numero di righe del file dato in input*/
 
−
z=j; /* setto gli array con il numero di righe del file contenente i comandi */
 
−
 
−
rewind(fd); /*ritorno all'inizio del file*/
 
−
 
−
/* riempie "comando[z]" con tutti i comandi presenti nel file passato, i comando sono contati da 1 a z. */
 
−
while (j!=0){ 
 
−
comando [i] = malloc (MAX*sizeof(char));
 
−
fgets(comando [i], MAX, fd);
 
−
i++;
 
−
j--;
 
−
}
 
−
 
−
i--; /* diminuisco "i" di uno perchè prima di uscire dall'ultimo ciclo è aumentata di uno, "j" è uguale a 0 */ 
 
−
 
−
/*ESEGUE TUTTI I COMANDI */
 
−
while (i>=0){
 
−
switch (ID[j]=fork()) {
 
−
case 0:
 
−
execsp(comando[j]);
 
−
perror("exec");
 
−
case -1:
 
−
perror ("fork");
 
−
return -1;
 
−
}
 
−
i--;
 
−
j++;
 
−
}
 
−
 
−
i=0; /*setto "i" a 0 per il prossimo while */
 
−
 
−
terminato=wait(&status);
 
−
 
−
/* TERMINA TUTTI I PROCESSI */
 
−
while(i<j){ /* "i" strettamente minore di "j" poichè nell'ultimo ciclo del precedente while viene incrementata di uno */
 
−
if (ID[i]!=terminato) {
 
−
  printf ("Termina processo %d\n",ID[i]);
 
−
kill(ID[i], SIGTERM); /* mando segnale di terminazione a tutti i PID che non sono ancora terminati */
 
−
}
 
−
else printf ("Processo completato %d\n",ID[i]);
 
−
i++;
 
−
}
 
−
 
−
fclose (fd);
 
−
return 0;
 
−
}
 
−
</source>
 
−
--[[User:Blissett|Blissett]] ([[User talk:Blissett|talk]]) 14:10, 11 March 2015 (CET)
 

Latest revision as of 15:17, 11 March 2015