[C] System Calls
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.
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
"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.
E come si fa?

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.
Grazie mille per l'aiuto ci do un occhiata:)