[C] System calls wait

JoKeRxbLaCk93
Ciao a tutti sto provando a risolvere un esercizio relativo alle system calls.
Il problema è il seguente:
"Scrivere un programma C in cui un processo P crea un figlio F. Il processo P deve leggere delle “frasi” digitate da tastiera, lunghe a piacimento (si considera terminata la frase quando l’utente preme il tasto invio), ed inviarle di volta in volta tramite una PIPE al figlio F. Il figlio F ogni frase che riceve dalla PIPE la stampa a video. Se il figlio F non riceve nulla per 60 secondi deve inviare un segnale SIGUSR1 al padre P e terminare; Il padre P ricevuto il segnale SIGUSR1 deve stampare a video
“tempo scaduto” e terminare."


Il pezzo di codice che ho sviluppato fino ad ora è il seguente:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>

int main(int argc, char *argv[]){

	pid_t pid;
	int mypipefd[2];
	int ret, ret2;
	int dim_buffer = 100;
	char buf[dim_buffer];
	unsigned int alarm = 10;
	
	ret = pipe(mypipefd);

	if(ret == -1){
		perror("pipe");
		exit(1);
	}

	pid = fork();
	
	if(pid == 0) {
		while(1){
			//CHILD PROCESS
			read(mypipefd[0], buf, dim_buffer);
			printf("|Child Process| stampa della frase: %s\n", buf);
		}
	} else {
		//PARENT PROCESS
		while(1) {
			ret2 = read(0, buf, dim_buffer);
			write(mypipefd[1], buf, dim_buffer);
		}
	}
	return 0;
}



Il problema che ho riscontrato è nel contare i 60 secondi prima di inviare il segnale SIGUSR, ovvero questo passo: "Se il figlio F non riceve nulla per 60 secondi deve inviare un segnale SIGUSR1 al padre P e terminare; Il padre P ricevuto il segnale SIGUSR1 deve stampare a video “tempo scaduto” e terminare." Come faccio a contare tot secondi? Ho trovato la funzione wait() ma non riesco a capirne il funzionamento leggendo dal man di linux e anche guardando sui vari siti web. Potete aiutarmi? Grazie mille.

Risposte
Albesa81
La funzione wait rileva il cambiamento di stato di un processo figlio, come spiegato esaurientemente qui. Quello che cerchi tu è probabilmente qualcosa come https://linux.die.net/man/2/alarm o https://linux.die.net/man/2/setitimer.

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