[C] System Calls

JoKeRxbLaCk93
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
#include
#include
#include
#include
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.

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

Risposte
Albesa81
"JoKeRxbLaCk":
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.

JoKeRxbLaCk93
E come si fa? :(

Albesa81
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.

JoKeRxbLaCk93
Grazie mille per l'aiuto ci do un occhiata:)

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.