Come spremere in altri parametri a una funzione Reaper quando un genitore è segnalato per uccidere un bambino (c)?

StackOverflow https://stackoverflow.com/questions/4399801

Domanda

Sto scrivendo un server TCP che funziona molto simile a una chat e mi sono imbattuto in questa domanda.

Quando un utente si collega, un processo figlio è stato creato per servire l'utente.
Quando un utente accede a, devo conservare il suo nome utente in un file di testo, online.txt
Ma quando un utente si disconnette, ho bisogno di rimuovere l'utente da online.txt (problema), il genitore poi signals un reaper() e uccide il bambino.

Le mie domande sono:

Q1: Come posso spremere in informazioni aggiuntive per il mietitore (come ad esempio il nome utente che l'utente utilizzato per accedere a) in modo che si può anche rimuovere l'utente da online.txt? O c'è un altro metodo migliore per farlo?

Q2: da dove viene sig nel reaper() prende il suo valore da? Posso aggiungere ulteriori parametri per il mietitore?

Q3: Potrei usare il pid del bambino come una sorta di chiave primaria per login.txt? Se sì, come posso recuperare il pid del bambino durante la reaper(), che è chiamato dal genitore?

Gli sguardi Reaper come questo:

void    reaper(int sig)//where does sig come from?
{
int status;

while (waitpid(-1, &status, WNOHANG) >= 0)
    ;
}

Il segnale usato dagli sguardi genitore in questo modo:

(void) signal(SIGCHLD, reaper);//how can I add more parameters?

Grazie in anticipo, spero chiedendo 3 domande in una volta non è troppo avidi.
Qualsiasi comprensione su una delle domande sarà molto apprezzato.

È stato utile?

Soluzione

Per quanto ho potuto capire dalla tua domanda, i registri di processo genitore Reaper () come gestore per SIGCHLD. Quando rileva un login, si scrive il nome utente per file e genera un bambino.

Al fine attività la funzione Reaper () viene chiamato in quanto il processo figlio ha rilevato la disconnessione e così uscito, giusto?

Se è così, perché non solo hanno il server di mantenere una struttura di dati di mappatura PID al nome utente. Poi prendere il valore restituito da waitpid e identificare quali nome utente deve essere rimosso dal file.

Quindi, per riassumere:

1) No. Sì.

2) dal segnale ricevuto dal gestore. No.

3) Sì. Dal valore di ritorno di waitpid ().

Altri suggerimenti

Domanda 1: la configurazione di un gestore di segnale per il processo figlio per eseguire una certa azione particolare essere adeguata? Tuttavia forse una soluzione migliore sarebbe quella di non utilizzare un file, piuttosto una in costrutto di memoria per memorizzare ciò che gli utenti sono connesso. In questo modo il mietitore potrebbe semplicemente eliminare la voce di memoria, o anche il gestore di segnale proposto.

Domanda 2: Non ho familiarità con il sistema operativo o l'architettura, ma direi che SIGCHLD sarebbe passata in Reaper (int sig) per il valore del parametro.

Domanda 3: Ottenere il PID è OS specifica. Per i tipi di POSIX di solito è getpid (), da unistd .. Tuttavia mi chiedo se si vuole veramente fare che con un file.

La soluzione può diventare vulnerabili a condizioni di gara quando si inizia la segnalazione in tutto il luogo ... che si presta ad un rischio per la sicurezza.

Gli utenti Compagni, non esitate a correggermi. Nella ricerca di una saggezza deve accettare istruzioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top