View Single Post
Old 28-10-2006, 18:12   #2
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
Iscritto dal: Jan 2006
Messaggi: 2722
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.
__________________

- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale.
- A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson

Ultima modifica di -fidel- : 28-10-2006 alle 18:56.
-fidel- è offline   Rispondi citando il messaggio o parte di esso