Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352

    [c]Creare processi con la fork

    Salve, ho un problema a far funzionare la fork per creare dei processi. Il mio scopo è avere il processo padre che crea 2 processi figli ognuno dei quali stampa una stringa. Ho scritto questo codice, in cui in un ciclo for il padre esegue la fork creando un figlio ad
    ogni iterazione:

    Codice PHP:
    #include <unistd.h>
    # include <stdio.h>

    int mainint argcchar **argv)
    {
        
    printf("\nInizio");
        
        
    int pid 1;
        
    int testNumber;
        
        for(
    testNumber 0; ((testNumber 2) && (pid != 0)); testNumber++){
            
    pid fork();
        }
            
            
    //Se sono il figlio pid vale zero e quindi stampo
        
    if(pid == 0){
            if(
    testNumber == 1){
                
    printf("\nuno");
            }
            if(
    testNumber == 2){
                
    printf("\ndue");
            }
        }
            
      return 
    0;

    Io mi aspetterei di vedere stampate in qualche ordine le stringhe "Inizio" "uno" "due",

    ivece ottengo:

    Inizio Inizio Inizio uno due

    Come mai? Non riesco a capire questo output. Perche Inizio appare tre volte? :quipy:

  2. #2
    Utente di HTML.it L'avatar di gokan
    Registrato dal
    Feb 2003
    Messaggi
    262
    Ciao anx, anche se non ti posso aiutare, volevo approfittare del 3d per chiederti se hai già studiato la realizzazione di thread, semafori etc sotto windows. Hai qualche buon link riguardo queste cose? Finora mi sono basata sull'MSDN di microsoft, spesso non è molto chiara

  3. #3
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    No, non so nulla dell'argomento che mi chiedi perche nonme ne sono occupato,


  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Non capisco perchè non funzioni... purtroppo ora non posso provarlo perchè non dispongo di una distribuzione Linux in questo momento, appena posso, però, lo provo.

    Per gokan... prova questo link, per thread e semafori: http://www.yolinux.com/TUTORIALS/Lin...ixThreads.html a me è stato utilissimo per il laboratorio di S.O.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it L'avatar di gokan
    Registrato dal
    Feb 2003
    Messaggi
    262
    Grazie, cercavo qualcosa di più rivolto alla programmazione sotto windows..in ogni caso è un buon link.
    Mi sa devo dare sotto con la guida MSDN.
    Ciao

  6. #6
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Ho trovato la spiegazione al problema:

    La printf scrive su stdout, che è line-buffered. Ciò vuol dire che i caratteri vengono mantenuti in un buffer interno, fino a quando una riga è completa (il fine riga è il carattere '\n'). Quindi: nel momento in cui si chiama la fork, sia il processo padre che il processo figlio ricevono una copia esatta di tutte le variabili, compreso il buffer di stdout e ciò che si trova dentro.

    Visto che mi trovo, come si fa a sincronizzare i processi?
    In particolare io vorrei che il processo padre non termini prima dei fili. Ho uilizzato subito dopo la fork l'istruzione

    wait(...)

    che mette in attesa un processo finche non è terminato uno dei figli, quindi il padre dovrebe attendere la terminazione dell'unico figlio generato nel ciclo for prima di andare avanti generando un altro figlio. Pero quello che accade è che il padre termina comunque prima. Come dovrei fare allora per realizzare quello che voglio?

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Devi utilizzare waitpid(0) (se non ricordo male, 0 significa che il padre attende la terminazione di tutti i processi figli).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    Usa i semafori o non sincronizzerai mai i processi con affidabilità.
    .:: Zetra.it - Web. ads . multimedia . graphix ::.
    Realizzazione siti web - Carte Magic ai prezzi più bassi d'italia
    - Comuni e Città

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.