Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16

Discussione: [C] Fork... Domande

  1. #1

    [C] Fork... Domande

    Qualcuno mi potrebbe spiegare qualcosa di piu' sui fork() ??
    Quando si usano a cosa servone ecc...
    Perche' io ho provato a guardare qualche manuale ma non riesco a capire a cosa servano...

    Es.
    Nel Programma qui sotto..
    A cosa mi serve creare un processo figlio che esegue i comandi digitati quando ho il padre che non fa niente ???
    codice:
    #include <sys/types.h>
    #include <string.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <stdio.h>
    
    #define DIM_COMMAND		1024
    
    int main (int argc, char **argv) {
    	char command[DIM_COMMAND];
    	pid_t pid;
    	
    	while (1) {
    		printf ("myShell >");
    		fgets(command, DIM_COMMAND-1, stdin);
    		command[strlen(command)-1] = '\0';
    		
    		if (!strcmp(command, "quit") || !strcmp(command, "exit")) exit(0);
    			
    		if (pid = fork()) {
    			wait(0);
    		} else {
    			if (system(command)) {
    				printf ("Not Found...\r\n");
    			}
    			exit(1);
    		}
    	}
    	
    	return (0);
    }
    Grazie.
    PoWered by:
    Gentoo 1.5.3 - Kernel 2.6.7
    Debian Sid - Kernel 2.6.7 - Bash 3.0
    Slackware current - Kernel 2.6.7

  2. #2
    Utente di HTML.it L'avatar di /dev/null
    Registrato dal
    May 2004
    Messaggi
    1,936

    Re: [C] Fork... Domande

    Originariamente inviato da kNemo
    Qualcuno mi potrebbe spiegare qualcosa di piu' sui fork() ??
    Quando si usano a cosa servone ecc...
    Perche' io ho provato a guardare qualche manuale ma non riesco a capire a cosa servano...

    Es.
    Nel Programma qui sotto..
    A cosa mi serve creare un processo figlio che esegue i comandi digitati quando ho il padre che non fa niente ???
    codice:
    #include <sys/types.h>
    #include <string.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <stdio.h>
    
    #define DIM_COMMAND		1024
    
    int main (int argc, char **argv) {
    	char command[DIM_COMMAND];
    	pid_t pid;
    	
    	while (1) {
    		printf ("myShell >");
    		fgets(command, DIM_COMMAND-1, stdin);
    		command[strlen(command)-1] = '\0';
    		
    		if (!strcmp(command, "quit") || !strcmp(command, "exit")) exit(0);
    			
    		if (pid = fork()) {
    			wait(0);
    		} else {
    			if (system(command)) {
    				printf ("Not Found...\r\n");
    			}
    			exit(1);
    		}
    	}
    	
    	return (0);
    }
    Grazie.
    La funzione fork crea un processo figlio...
    Praticamente sdoppia il programma (lo biforca) in due processi: padre e figlio...
    La fork() restituisce valore < 0 se non e' stato possibile creare un processo figlio. Restituisce 0 se il processo corrente e' il figlio, o > 0 se il processo e' il padre...

    Nel tuo programma il processo padre esegue wait(0); (ossia aspetta che il figlio muore) e dopo la morte del figlio continua il ciclo...
    Il figlio invece esegue i comandi
    if (system(command)) {
    printf ("Not Found...\r\n");
    }
    exit(1); // in questo punto muore


    Ultima modifica ad opera dell'utente /dev/null il 01-01-0001 alle 00:00

  3. #3
    Ti faccio un esempio di utilita' del fork().
    Ammettiamo che devi creare un client che si collega ad un server con le socket!
    Non puoi mettere i cicli tutti in un processo perche' se metti un recv lui si blocca e non puoi mandare niente finquando lui non manda qualche dato, il recv si sblocca e mandi i dati tu.
    Magari puoi creare una funziona che riceve i dati e li stampa, lo forki, ed il padre continua a mandare dati.

    In questo modo ricv e send non si bloccano a vicenda.......... insomma dipende da cosa si vuole fare!

    Comunque oltre al fork (che proprio crea un altro processo a se') ci sono anche i pthread, che alla chiusura del programma si arrestano anche loro.

    Quindi dipende dalle situazioni perche' ti possono talvolta servire i fork e talvolta i pthread

  4. #4
    mmm.. Qualcosa in piu' ho capito...


    Ma potresti farmi l'esempio con il recv() non l'ho capito ma mi interessa...
    PoWered by:
    Gentoo 1.5.3 - Kernel 2.6.7
    Debian Sid - Kernel 2.6.7 - Bash 3.0
    Slackware current - Kernel 2.6.7

  5. #5
    Utente di HTML.it L'avatar di /dev/null
    Registrato dal
    May 2004
    Messaggi
    1,936
    Originariamente inviato da kNemo
    mmm.. Qualcosa in piu' ho capito...


    Ma potresti farmi l'esempio con il recv() non l'ho capito ma mi interessa...
    Come ho già detto, quando usi la fork il programma si divide in due processi (condividono la memoria per le costanti e per il codice, ma ognuno dei due ha una copia personale delle variabili) e ogni processo può eseguire funzioni diverse dagli altri...
    Se vuoi utilizzare una funzione che blocca il programma (come la scanf, o la recv, che bloccano l'esecuzione del programma finchè non ricevono valore), ma vuoi che il programma resti in ascolto, ma continui anche ad eseguire altre operazioni puoi farlo in questo modo:
    forki il programma e metti il figlio in ascolto (gli fai eseguire la funzione recv), mentre al padre fai eseguire altre operazioni...
    Devo dire però che per fare questo però non conviene questo metodo, poichè copia TUTTE le variabili di tutte le funzioni del programma... Conviene invece usare i pthread ( POSIX Thread ), che permettono di creare thread che hanno una copia delle variabili di una specifica funzione...

    La fork infatti più che venire utilizzata a questi scopi viene usata per far eseguire al programma un altro programma continuando però a girare. Si fa in questo modo:
    Esegui la fork e al processo figlio fai eseguire una funzione della famiglia execve per richiamare un altro programma, mentre il padre continua normalmente.

    (quant'è brutto sto ciauz )
    Ultima modifica ad opera dell'utente /dev/null il 01-01-0001 alle 00:00

  6. #6
    mm..Capito...

    Grazie.
    <- Sembra stupido
    PoWered by:
    Gentoo 1.5.3 - Kernel 2.6.7
    Debian Sid - Kernel 2.6.7 - Bash 3.0
    Slackware current - Kernel 2.6.7

  7. #7
    Non e' che percaso avete qualche link a qualche guida su fork() e pthread()

    Qualcuno potrebbe anche spiegarmi con qualche esempio (pratico) cos'e' un pthread come si usano ecc..

    Grazie.
    PoWered by:
    Gentoo 1.5.3 - Kernel 2.6.7
    Debian Sid - Kernel 2.6.7 - Bash 3.0
    Slackware current - Kernel 2.6.7

  8. #8
    Utente di HTML.it L'avatar di /dev/null
    Registrato dal
    May 2004
    Messaggi
    1,936
    [QUOTE]Originariamente inviato da kNemo
    Non e' che percaso avete qualche link a qualche guida su fork() e pthread()

    Qualcuno potrebbe anche spiegarmi con qualche esempio (pratico) cos'e' un pthread come si usano ecc..

    Grazie.
    Prova a cercare su google con le keywords "pthread_create": http://www.google.com/search?q=pthre...utf-8&oe=utf-8
    Si trova un sacco di roba, molta anche in italiano...

    Ultima modifica ad opera dell'utente /dev/null il 01-01-0001 alle 00:00

  9. #9
    Utente di HTML.it L'avatar di Ed_Bunker
    Registrato dal
    Jul 2003
    Messaggi
    1,119
    Originariamente inviato da kNemo
    Non e' che percaso avete qualche link a qualche guida su fork() e pthread()

    Qualcuno potrebbe anche spiegarmi con qualche esempio (pratico) cos'e' un pthread come si usano ecc..

    Grazie.
    Prova a cercare "Gapil" con google. E' una bella guida on line. Molto utile per certi aspetti.

  10. #10
    Se ho un processo padre e un processo figlio...
    L'occupazione in memoria e' uguale per tutti e due e comprende tutte le variabili del pgm ???

    Es.
    codice:
    #include <stdio.h>
    
    int var1;        /* 4 byte */
    
    int main() {
       int var2;     /* 4byte */
       char var3[10]; /* 10byte */
    
       if (fork()) {
           /* Io Quanto Occupoo ??? */
       } else {
           /* Io Quanto Occupoo ??? */
       }
    }
    PoWered by:
    Gentoo 1.5.3 - Kernel 2.6.7
    Debian Sid - Kernel 2.6.7 - Bash 3.0
    Slackware current - Kernel 2.6.7

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.