Skip to content

Commit

Permalink
Stuff
Browse files Browse the repository at this point in the history
  • Loading branch information
mfranzil committed May 26, 2019
2 parents af9c15d + 6ae5337 commit 70ef4b2
Show file tree
Hide file tree
Showing 9 changed files with 257 additions and 531 deletions.
215 changes: 33 additions & 182 deletions Progetto/src/actions.c

Large diffs are not rendered by default.

94 changes: 37 additions & 57 deletions Progetto/src/devices/bulb.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@

/* BULB = 1 */

int shellpid;
int shellpid; /* pid della centralina */

/* Registri della lampadina */
int fd; /* file descriptor della pipe verso il padre */
int pid, __index; /* variabili di stato */
int status = 0; /* interruttore accensione */
time_t start, time_on;
int fd; /* file descriptor della pipe verso il padre */
int pid, __index; /* variabili di stato */
int status = 0; /* interruttore accensione */
time_t start, time_on; /* tempo_accensione */
int changed = 1;

key_t key;
Expand All @@ -17,8 +17,9 @@ int msgid;
volatile int flag_usr1 = 0;
volatile int flag_usr2 = 0;
volatile int flag_term = 0;
volatile int flag_int = 0;
volatile int flag_int = 0;

/* handler dei segnali */
void sighandler_int(int sig) {
if (sig == SIGUSR1) {
flag_usr1 = 1;
Expand All @@ -29,66 +30,55 @@ void sighandler_int(int sig) {
if (sig == SIGTERM) {
flag_term = 1;
}
if(sig ==SIGINT){
if(sig == SIGINT){
flag_int = 1;
}
}

int main(int argc, char* argv[]) {
/* argv = [./bulb, indice, /tmp/indice]; */
/* argv = [./bulb, indice, /tmp/indice]; */
int main(int argc, char* argv[]) {
char tmp[MAX_BUF_SIZE]; /* Buffer per le pipe*/
/*char ppid_pipe[MAX_BUF_SIZE];*/
char* this_pipe = NULL; /* nome della pipe */
char** vars = NULL; /* parametri del device */

char** vars = NULL;
/*int ppid, ppid_pipe_fd; */
pid = getpid(); /* ottiene il pid */
__index = atoi(argv[1]); /* trasforma indice */
shellpid = get_shell_pid(); /* prende pid della shell */

this_pipe = argv[2];
pid = getpid();
__index = atoi(argv[1]);
fd = open(this_pipe, O_RDWR);

shellpid = get_shell_pid();
/* preparo message queue */
key = ftok("/tmp/ipc/mqueues", pid); /* converto pathname */
msgid = msgget(key, 0666 | IPC_CREAT); /* associo message queue */

signal(SIGTERM, sighandler_int);
signal(SIGUSR1, sighandler_int);
signal(SIGUSR2, sighandler_int);
signal(SIGINT, sighandler_int);

key = ftok("/tmp/ipc/mqueues", pid);
msgid = msgget(key, 0666 | IPC_CREAT);

while (1) {
/* quando riceve un segnale SIGUSR1 -> invia le proprie informazioni */
if (flag_usr1) {
flag_usr1 = 0;
/*printf("bulb usr1: %d - %d\n", pid, flag_usr1);*/
if (status) {
time_on = (time(NULL) - start);
} else {
time_on = 0;
}

/* compongo messaggio */
sprintf(tmp, "1|%d|%d|%d|%d",
pid, __index, status, (int)time_on);
message.mesg_type = 1;
sprintf(message.mesg_text, "%s", tmp);
/*printf("Sending Message...\n");*/
/*int rc = */
msgsnd(msgid, &message, sizeof(message), 0);
/*printf("Message Sent: %s\n", message.mesg_text);*/
msgsnd(msgid, &message, sizeof(message), 0); /* invio messaggio */

/*write(fd, tmp, MAX_BUF_SIZE);*/
}
/* quando ricevo un segnale SIGUSR2 -> ricevo dalla message queue cosa devo fare */
/* 0|... -> accendi/spegni lampadina */
if (flag_usr2) {
int ret;
flag_usr2 = 0;
/* La finestra apre la pipe in lettura e ottiene cosa deve fare. */
/* 0|... -> accendi/spegni lampadina */

/*printf("ho ricevuto un messaggio pid: %d\n", pid); */

//read(fd, tmp, MAX_BUF_SIZE);
int ret = msgrcv(msgid, &message, sizeof(message), 1, IPC_NOWAIT);
if(ret == -1){
ret = msgrcv(msgid, &message, sizeof(message), 1, IPC_NOWAIT);
if (ret == -1) {
printf("Errore lettura messaggio\n");
}
sprintf(tmp, "%s", message.mesg_text);
Expand All @@ -104,37 +94,27 @@ int main(int argc, char* argv[]) {
}
changed = 1;
}
/* quando ricevo un segnale SIGTERM -> disalloca message queue */
if (flag_term) {
int ppid = (int)getppid();
/*if(ppid != shellpid){
key_t key_ppid = ftok("/tmp/ipc/mqueues", ppid);
int msgid_ppid = msgget(key_ppid, 0666 | IPC_CREAT);
sprintf(message.mesg_text, "2|%d", pid);
message.mesg_type = 1;
msgsnd(msgid_ppid, &message, sizeof(message), 0);
kill(ppid, SIGURG);
}*/
msgctl(msgid, IPC_RMID, NULL);
msgctl(msgid, IPC_RMID, NULL); /* disalloca message queue */
exit(0);
}
if(flag_int){
printf("Signal GOT\n");
flag_int =0;
int ppid = (int)getppid();
if(ppid != shellpid){
/* quando ricevo un segnale SIGINT -> avverto mio padre che sto per morire */
if (flag_int) {
int ppid;
flag_int = 0;
ppid = (int)getppid(); /* pid di mio padre */
if (ppid != shellpid) {
key_t key_ppid = ftok("/tmp/ipc/mqueues", ppid);
int msgid_ppid = msgget(key_ppid, 0666 | IPC_CREAT);
int msgid_ppid = msgget(key_ppid, 0666 | IPC_CREAT);
sprintf(message.mesg_text, "2|%d", pid);
message.mesg_type = 1;
msgsnd(msgid_ppid, &message, sizeof(message), 0);
printf("Killing Father to say i love him\n");
kill(ppid, SIGURG);
msgsnd(msgid_ppid, &message, sizeof(message), 0);
kill(ppid, SIGURG);
}
msgctl(msgid, IPC_RMID, NULL);
msgctl(msgid, IPC_RMID, NULL); /* disalloco message queue */
exit(0);
}
//sleep(10);
}

return 0;
}
98 changes: 46 additions & 52 deletions Progetto/src/devices/fridge.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,23 @@

/* Frigo = 2 */

int shellpid;
int shellpid; /* pid della centralina */

/* Registri del frigorifero */
int fd; /* file descriptor della pipe verso il padre */
int pid, __index, delay, perc, temp; /* variabili di stato */
char log_buf[MAX_BUF_SIZE / 4]; /* buffer della pipe SE CI SONO PROBLEMI; GUARDA QUI */
char log_buf[MAX_BUF_SIZE / 4]; /* buffer della pipe */
int status = 0; /* interruttore accensione */
time_t start, time_on;
time_t start, time_on; /* tempo_accensione */
key_t key;
int msgid;

volatile int flag_usr1 = 0;
volatile int flag_usr2 = 0;
volatile int flag_term = 0;
volatile int flag_int =0;
volatile int flag_int = 0;

/* handler dei segnali */
void sighandler_int(int sig) {
if (sig == SIGUSR1) {
flag_usr1 = 1;
Expand All @@ -29,35 +31,35 @@ void sighandler_int(int sig) {
}
}

int main(int argc, char* argv[]) {
/* argv = [./fridge, indice, /tmp/indice]; */
char tmp[MAX_BUF_SIZE];
/*char ppid_pipe[MAX_BUF_SIZE];*/
/* argv = [./fridge, indice, /tmp/indice]; */
int main(int argc, char* argv[]) {
char tmp[MAX_BUF_SIZE]; /* Buffer per le pipe*/
char* this_pipe = NULL; /* nome della pipe */

char** vars = NULL;
/*int ppid, ppid_pipe_fd; */
char** vars = NULL; /* parametri del device */

this_pipe = argv[2];
pid = getpid();
__index = atoi(argv[1]);
fd = open(this_pipe, O_RDWR);
pid = getpid(); /* ottiene il pid */
__index = atoi(argv[1]); /* trasforma indice */
fd = open(this_pipe, O_RDWR); /* apre pipe */
shellpid = get_shell_pid(); /* prende pid della shell */

key = ftok("/tmp/ipc/mqueues", pid);
msgid = msgget(key, 0666 | IPC_CREAT);
/* preparo message queue */
key = ftok("/tmp/ipc/mqueues", pid); /* converto pathname */
msgid = msgget(key, 0666 | IPC_CREAT); /* associo message queue */

/* parametri de default */
delay = 15;
perc = 50;
temp = 5;

shellpid = get_shell_pid();

sprintf(log_buf, "-");

signal(SIGTERM, sighandler_int);
signal(SIGUSR1, sighandler_int);
signal(SIGUSR2, sighandler_int);

while (1) {
/* quando riceve un segnale SIGUSR1 -> invia le proprie informazioni */
if (flag_usr1) {
flag_usr1 = 0;

Expand All @@ -67,30 +69,31 @@ int main(int argc, char* argv[]) {
time_on = 0;
}

/* compongo messaggio */
sprintf(tmp, "2|%d|%d|%d|%d|%d|%d|%d|%s",
pid, __index, status, (int)time_on, delay, perc, temp, log_buf);
message.mesg_type = 1;
sprintf(message.mesg_text, "%s", tmp);
/*int rc = */
msgsnd(msgid, &message, sizeof(message), 0);
/* write(fd, tmp, MAX_BUF_SIZE); */
msgsnd(msgid, &message, sizeof(message), 0); /* invio messaggio */

/* Resetto il contenuto del buffer */
sprintf(log_buf, "-");
}
/* quando ricevo un segnale SIGUSR2 -> ricevo dalla message queue cosa devo fare */
/* 0|... -> chiudi/apri frigo */
/* 1|TEMP -> setta temperatura del frigo */
/* 2|DELAY -> setta delay di chiusura */
/* 3|PERCENT -> setta contenuto */
if (flag_usr2) {
int ret;
flag_usr2 = 0;
/* Al ricevimento del segnale, il frigo apre la pipe in lettura e ottiene cosa deve fare. */
/* 0|... -> chiudi/apri frigo */
/* 1|TEMP -> setta temperatura del frigo */
/* 2|DELAY -> setta delay di chiusura */
/* 3|PERCENT -> setta contenuto */

int ret = msgrcv(msgid, &message, sizeof(message), 1, IPC_NOWAIT);
if(ret == -1){

ret = msgrcv(msgid, &message, sizeof(message), 1, IPC_NOWAIT);
if (ret == -1) {
printf("Errore lettura messaggio\n");
}
sprintf(tmp, "%s", message.mesg_text); vars = split_fixed(tmp, 2);
sprintf(tmp, "%s", message.mesg_text);
vars = split_fixed(tmp, 2);

if (atoi(vars[0]) == 0) {
if (!status) {
Expand All @@ -108,44 +111,35 @@ int main(int argc, char* argv[]) {
perc = atoi(vars[1]);
}
}
/* quando ricevo un segnale SIGTERM -> disalloca message queue */
if (flag_term) {
/*if ((int)getppid() != shellpid) {
ppid = (int)getppid();
kill(ppid, SIGUSR2);
get_pipe_name(ppid, ppid_pipe);
ppid_pipe_fd = open(ppid_pipe, O_RDWR);
sprintf(tmp, "2|%d", (int)getpid());
write(ppid_pipe_fd, tmp, sizeof(tmp));
close(ppid_pipe_fd);
}*/
msgctl(msgid, IPC_RMID, NULL);
exit(0);
}
if(flag_int){
printf("Signal GOT\n");
flag_int =0;
int ppid = (int)getppid();
if(ppid != shellpid){
key_t key_ppid = ftok("/tmp/ipc/mqueues", ppid);
/* quando ricevo un segnale SIGINT -> avverto mio padre che sto per morire */
if (flag_int) {
int ppid;
flag_int = 0;
ppid = (int)getppid();
if (ppid != shellpid) {
key_t key_ppid = ftok("/tmp/ipc/mqueues", ppid);
int msgid_ppid = msgget(key_ppid, 0666 | IPC_CREAT);
sprintf(message.mesg_text, "2|%d", pid);
message.mesg_type = 1;
sprintf(message.mesg_text, "2|%d", pid);
message.mesg_type = 1;
msgsnd(msgid_ppid, &message, sizeof(message), 0);
printf("Killing Father to say i love him\n");
kill(ppid, SIGURG);
}
msgctl(msgid, IPC_RMID, NULL);
msgctl(msgid, IPC_RMID, NULL); /* disalloco message queue */
exit(0);
}
/* chiusura automatica */
if (status == 1 && start <= time(NULL) - delay) {
status = 0;
sprintf(log_buf,
"Il frigorifero %d si è chiuso automaticamente dopo %d secondi",
__index, delay);
}

//sleep(1);
}

}
return 0;
}
Loading

0 comments on commit 70ef4b2

Please sign in to comment.