[C] System Calls

Messaggioda JoKeRxbLaCk » 17/02/2017, 13:57

Ciao a tutti ho questo problema:

Scrivere un programma C in cui un processo P crea un figlio F.
Il figlio F resta in attesa che l’utente digiti la password, se ´e corretta invia un segnale: sigusr1 al padre,
altrimenti dopo 3 tentativi deve inviare il segnale sigusr2 al padre e terminare; se riceve il segnale sigusr1
deve terminare visualizzando il messaggio “tempo scaduto”.
Il padre trascorsi 30 secondi (se non ha ricevuto nessun segnale dal figlio) deve inviare il segnale sigusr1
al figlio e terminare con exit(1); se riceve il segnale sigusr1 deve terminare con exit(0); se riceve il segnale
sigusr2 deve terminare con exit(2).
Eventuali System Call da utilizzare:
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <signal.h>
pid t fork(void);
int kill(pid t pid, int sig);
void (*signal(int signum, void (*sighandler)(int)))(int);
unsigned int sleep(unsigned int seconds);
unsigned int alarm(unsigned int seconds);

Come posso risolverlo? Io ho provato nel seguente modo, ma non so se è corretto, perchè non mi sembra di aver utilizzato appropriatamente le system calls.

Codice:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <signal.h>

void fatherprocess(int mysignal, int fatherpid){
    if (mysignal == SIGUSR1) {
        printf("ACCESS GRANTED!\n");
        kill(fatherpid, SIGUSR1);
        exit(0);
    }

    if (mysignal == SIGUSR2){
        printf("ACCESS DISCARDED! More than 3 tentatives!\n");
        kill(fatherpid, SIGUSR2);
        exit(2);
    }

}


void childprocess(int mysignal, int childpid){
    if (mysignal == SIGUSR1) {
        printf("TIMEOUT\n");
        kill(childpid, SIGUSR1);
        exit(1);
    }
}


int main(int argc, char *argcv[]){
int fatherpid, childpid;
char enteredpassword[] = "test", password[] = "test";
int i =0;
unsigned int time_to_sleep = 30;

fatherpid = getpid();
childpid = fork();

if (childpid == 0) {
    printf("Child Process waiting for a password\n");
    while (1){
        if (i < 3) {
            printf("Enter Password: ");
            scanf("%s", enteredpassword);
            if (strcmp(enteredpassword, password) == 0)
                fatherprocess(SIGUSR1, fatherpid);
        } else {
            fatherprocess(SIGUSR2, fatherpid);
            exit(1);
        }
        i++;
    }
} else {
    printf("Father Process\n");
    while(time_to_sleep){
        time_to_sleep = sleep(time_to_sleep);
        childprocess(SIGUSR1, childpid);
    }
}
return 0;
}
JoKeRxbLaCk
Junior Member
Junior Member
 
Messaggio: 116 di 250
Iscritto il: 06/06/2015, 09:17

Re: [C] System Calls

Messaggioda Albesa81 » 18/02/2017, 00:58

JoKeRxbLaCk ha scritto:Come posso risolverlo? Io ho provato nel seguente modo, ma non so se è corretto, perchè non mi sembra di aver utilizzato appropriatamente le system calls.

Devi definire un comportamento di default per ciascuno dei segnali da trattare e determinare cosa fare in base a quale processo sta ricevendo il segnale.
Albesa81
Junior Member
Junior Member
 
Messaggio: 78 di 341
Iscritto il: 21/12/2010, 12:02

Re: [C] System Calls

Messaggioda JoKeRxbLaCk » 18/02/2017, 09:49

E come si fa? :(
JoKeRxbLaCk
Junior Member
Junior Member
 
Messaggio: 117 di 250
Iscritto il: 06/06/2015, 09:17

Re: [C] System Calls

Messaggioda Albesa81 » 18/02/2017, 10:11

Studiando il concetto di processo e come questo viene gestito da Linux, ad esempio sull'ottimo "Advanced Linux Programming". Trovi la documentazione delle system call da te elencate nel man di Linux e in rete.
Albesa81
Junior Member
Junior Member
 
Messaggio: 79 di 341
Iscritto il: 21/12/2010, 12:02

Re: [C] System Calls

Messaggioda JoKeRxbLaCk » 18/02/2017, 10:12

Grazie mille per l'aiuto ci do un occhiata:)
JoKeRxbLaCk
Junior Member
Junior Member
 
Messaggio: 118 di 250
Iscritto il: 06/06/2015, 09:17


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite