Difference between revisions of "Esercizio 1, prova pratica 29.05.2013"
Jump to navigation
Jump to search
(Created page with "<source lang="txt"> Scrivere un programma testeventfd che faccia uso della system call eventfd. In particolare il programma deve eseguire una fork, quando l'utente digita un n...") |
|||
(7 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
− | <source lang=" | + | <source lang="text"> |
Scrivere un programma testeventfd che faccia uso della system call eventfd. | Scrivere un programma testeventfd che faccia uso della system call eventfd. | ||
In particolare il programma deve eseguire una fork, quando l'utente digita un numero letto dal processo padre, il processo | In particolare il programma deve eseguire una fork, quando l'utente digita un numero letto dal processo padre, il processo | ||
Line 10: | Line 10: | ||
#include <stdlib.h> | #include <stdlib.h> | ||
#include <stdio.h> | #include <stdio.h> | ||
+ | #include <stdint.h> | ||
int main (int argc, char *argv[]) { | int main (int argc, char *argv[]) { | ||
− | int efd,i | + | int efd, i; |
− | + | long long unsigned int val; | |
− | + | ssize_t s; | |
− | |||
− | |||
− | |||
/* Check for eventfd error */ | /* Check for eventfd error */ | ||
Line 26: | Line 24: | ||
} | } | ||
− | /* Use fork to move eventfd form parent | + | /* Use fork to move eventfd form parent to child */ |
switch (fork()) { | switch (fork()) { | ||
− | |||
case 0: | case 0: | ||
+ | /* Read parent event */ | ||
+ | s = read(efd, &val, sizeof(long long unsigned int)); | ||
− | + | if (s != sizeof(long long unsigned int)) { | |
− | + | perror("Read Error"); | |
− | + | exit(EXIT_FAILURE); | |
+ | } | ||
− | + | /* For is used to print the 'x' of the argument passed by terminal */ | |
− | + | for (i = (int)val; i > 0; i--) { | |
− | + | printf ("x\n"); | |
− | |||
− | |||
} | } | ||
+ | |||
exit(EXIT_SUCCESS); | exit(EXIT_SUCCESS); | ||
Line 49: | Line 48: | ||
exit(EXIT_FAILURE); | exit(EXIT_FAILURE); | ||
− | |||
default: | default: | ||
− | + | /* Wait for number */ | |
− | exit(EXIT_SUCCESS); | + | printf ("Inserisci un intero diverso da 0: \n"); |
+ | scanf ("%llu", &val); | ||
+ | |||
+ | /* Write parent event */ | ||
+ | s = write(efd, &val, sizeof(long long unsigned int)); | ||
+ | |||
+ | if (s != sizeof(long long unsigned int)) { | ||
+ | perror("Write Error"); | ||
+ | exit(EXIT_FAILURE); | ||
+ | } | ||
+ | |||
+ | exit(EXIT_SUCCESS); | ||
} | } | ||
} | } | ||
+ | </source> | ||
+ | ==Soluzione di Maldus== | ||
+ | Semaforo implementato usando un altro eventfd. | ||
+ | <source lang="c"> | ||
+ | #include <stdio.h> | ||
+ | #include <sys/eventfd.h> | ||
+ | #include <inttypes.h> | ||
+ | #include <sys/types.h> | ||
+ | #include <signal.h> | ||
+ | |||
+ | |||
+ | int main(){ | ||
+ | pid_t son ; | ||
+ | int ed1 , ed2 , i; | ||
+ | uint64_t x = 1; | ||
+ | int y = 1 ; | ||
+ | ed1 = eventfd(0,0) ; /*eventfd usato per la comunicazione effettiva del numero*/ | ||
+ | ed2 = eventfd( 1 , EFD_SEMAPHORE ) ; /*eventfd usato come semaforo*/ | ||
+ | switch( son = fork() ){ | ||
+ | case 0: | ||
+ | while( 1 ){ | ||
+ | read( ed1 , &x , 8) ; /*se ci sono dei dati li legge*/ | ||
+ | for(i = x ; i > 0 ; i--) printf( "x" ) ; | ||
+ | printf("\n"); | ||
+ | write(ed2 , &y , 8 ) ; /*dopo la lettura dei dati, dà il via libera sul semaforo per scrivere di nuovo*/ | ||
+ | } | ||
+ | return 1; | ||
+ | default: | ||
+ | while( x ){ | ||
+ | read( ed2 , &y , 8 ) ; /*si blocca sul semaforo se i dati non sono ancora stati letti*/ | ||
+ | scanf("%" PRIu64 , &x) ; | ||
+ | write(ed1 , &x , 8 ) ; /*scrittura dei dati*/ | ||
+ | } | ||
+ | kill(son ,SIGTERM); | ||
+ | return 0 ; | ||
+ | } | ||
+ | } | ||
</source> | </source> |
Latest revision as of 09:28, 25 March 2015
Scrivere un programma testeventfd che faccia uso della system call eventfd.
In particolare il programma deve eseguire una fork, quando l'utente digita un numero letto dal processo padre, il processo
figlio deve stampare un numero uguale di x.
Soluzione di Pierg
#include <sys/eventfd.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
int main (int argc, char *argv[]) {
int efd, i;
long long unsigned int val;
ssize_t s;
/* Check for eventfd error */
efd = eventfd(0, 0);
if (efd == -1) {
perror("Eventfd Error");
}
/* Use fork to move eventfd form parent to child */
switch (fork()) {
case 0:
/* Read parent event */
s = read(efd, &val, sizeof(long long unsigned int));
if (s != sizeof(long long unsigned int)) {
perror("Read Error");
exit(EXIT_FAILURE);
}
/* For is used to print the 'x' of the argument passed by terminal */
for (i = (int)val; i > 0; i--) {
printf ("x\n");
}
exit(EXIT_SUCCESS);
/* Check for error */
case -1:
perror("Fork Error");
exit(EXIT_FAILURE);
default:
/* Wait for number */
printf ("Inserisci un intero diverso da 0: \n");
scanf ("%llu", &val);
/* Write parent event */
s = write(efd, &val, sizeof(long long unsigned int));
if (s != sizeof(long long unsigned int)) {
perror("Write Error");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
}
Soluzione di Maldus
Semaforo implementato usando un altro eventfd.
#include <stdio.h>
#include <sys/eventfd.h>
#include <inttypes.h>
#include <sys/types.h>
#include <signal.h>
int main(){
pid_t son ;
int ed1 , ed2 , i;
uint64_t x = 1;
int y = 1 ;
ed1 = eventfd(0,0) ; /*eventfd usato per la comunicazione effettiva del numero*/
ed2 = eventfd( 1 , EFD_SEMAPHORE ) ; /*eventfd usato come semaforo*/
switch( son = fork() ){
case 0:
while( 1 ){
read( ed1 , &x , 8) ; /*se ci sono dei dati li legge*/
for(i = x ; i > 0 ; i--) printf( "x" ) ;
printf("\n");
write(ed2 , &y , 8 ) ; /*dopo la lettura dei dati, dà il via libera sul semaforo per scrivere di nuovo*/
}
return 1;
default:
while( x ){
read( ed2 , &y , 8 ) ; /*si blocca sul semaforo se i dati non sono ancora stati letti*/
scanf("%" PRIu64 , &x) ;
write(ed1 , &x , 8 ) ; /*scrittura dei dati*/
}
kill(son ,SIGTERM);
return 0 ;
}
}