Codice:
char comando;
...
comando = 0;
while (comando != 2)
{
printf("[1.Accedi - 2.Esci]");
comando = getchar();
/* Pulisco il buffer di input. */
while (getchar() != '\n');
if (isdigit(comando))
{
if (comando == 1)
{
printf("\nComando 1\n\n");
/* Operazioni varie... */
}
}
else
printf("\nComando non valido. Riprovare...\n\n");
}
...
return 0;
Quote:
|
Originariamente inviato da megamello
il "comando1" in realtà sarebbe una fork seguita da una exec per un client. già che ci sono vi chiedo anche: se faccio una fork e sul figlio una exec, ilprocesso padre rimanente attivo, come si comportano i programmi? il figlio va sulla stessa shell o su un'altra istanza della shell? posso implementare accesso concorrente con questo metodo (es 2 utenti che utilizzano 2 client diversi generati dallo stesso padre)?
|
Il processo padre rimane attivo, mentre il processo figlio
sostituisce (nel caso della famiglia di funzioni exec()) l'immagine del suo processo con quella del processo specificato nella exec(). Quindi il processo figlio diventa "indipendente" dal processo padre, per quanto, essendo il pid del figlio sempre lo stesso, il padre può ad esempio fare una wait() per attendere il figlio, ecc.
EDIT: Per quanto riguarda la fork() (peraliamo quindi di unix/linux/e simili) prova questo semplice programma:
Codice:
#include <stdio.h>
#include <unistd.h>
int main(void)
{
int pid, status;
if ((pid = fork()) == 0)
{
/* Sono il figlio. */
printf("Sono il figlio: pid %d\n\n", getpid());
execl("/bin/ls", "ls" "-l", "-a", (char *) 0);
/* Prova a mettere del codice qui sotto... */
}
else
{
/* Sono il padre. */
printf("Sono il padre: pid %d, pid del figlio %d\nAttendo la terminazione del figlio...\n\n", getpid(), pid);
wait(&status);
printf("Figlio terminato, uscita.\n");
}
return 0;
}
Prova anche a sostituire un altro programma per la execl, magari uno che richiede più tempo di esecuzione, per vedere meglio il comportamento del padre.