Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - fork in windows
Forum - C/C++ - fork in windows - Pagina 3

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
andreamica (Ex-Member)
Rookie


Messaggi: 24
Iscritto: 25/02/2007

Segnala al moderatore
Postato alle 21:06
Domenica, 04/11/2007
ok ho sostituito la execl() kn la funzione spawnl. faccio il primo figlio e funziona perfettamente, faccio il secondo, il programma viene lanciato ma va in crash il padre e si chiude tutto (rimane in esecuzione solo il programma lanciato dal figlio). Posto un pezzo del codice:

void InstallaDriver()
{
    DWORD dwThreadId;
    DWORD dwThrdParam = 1;
    HANDLE thread;
    
    int NumSetup;     /*indica il numero del driver da installare*/
    
    printf ("\nN.B.: è consigliato, se richiesto, selezionare la casella \"Riavviare il computer in un secondo momento\" \nper permettere una installazione lineare di tutti i driver. Premi Enter.\n");
    fgets (Vuoto,2,stdin);
    
    for(NumSetup=0;NumSetup<2;++NumSetup)
    {
        thread = CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE)CodiceFiglio(NumSetup), &dwThrdParam, 0, &dwThreadId);
        CloseHandle(thread);
    }
    return;
}

DWORD CodiceFiglio(int NumSetup)
{
      /*Codice figlio*/
      printf ("\nSono nel figlio");
      
      if (NumSetup==0)
      {
         printf ("\nInstallazione \"%s\" in corso...",NOME_CHIPSET);
         spawnl(_P_WAIT,"driver chipset/infinst_autol.exe",NULL);
      }
      if (NumSetup==1)
      {
         printf ("\nInstallazione \"%s\" in corso...",NOME_TOUCH);
         spawnl(_P_WAIT,"driver touchpad/Setup.exe",NULL);
      }
      
      return;
}

PM Quote
Avatar
WARRIOR (Ex-Member)
Guru


Messaggi: 627
Iscritto: 30/03/2007

Segnala al moderatore
Postato alle 22:56
Domenica, 04/11/2007
Postalo tutto, perchè se dobbiamo provare il programma, riscrivere il main è scomodo ;).
Devi assicurarti che il padre finisca dopo che i due thread figli vengano terminati. :k:

PM Quote
Avatar
andreamica (Ex-Member)
Rookie


Messaggi: 24
Iscritto: 25/02/2007

Segnala al moderatore
Postato alle 6:55
Lunedì, 05/11/2007
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>
#include <fcntl.h>
#include <process.h>
#include <unistd.h>
#include <windows.h>
#define NOME_VIDEO "Ati Mobility Radeon X1400"
#define VERS_VIDEO "8.261"
#define SETUP_VIDEO "driver video/Setup.exe"
#define NOME_AUDIO "Realtek ALC885 Audio Codec"
#define VERS_AUDIO "5.10.0.5307"
#define SETUP_AUDIO "driver audio/Setup.exe"
#define NOME_CHIPSET "Intel Mobile 945PM Express Chipset"
#define VERS_CHIPSET "7.2.2.1006"
#define SETUP_CHIPSET "driver chipset/infinst_autol.exe"
#define NOME_LAN "Realtek 8169/8110 Gigabit"
#define VERS_LAN "5.635.0923.2005"
#define SETUP_LAN "driver lan/Setup.exe"
#define NOME_MODEM "Motorola SM56 Data Fax Modem"
#define VERS_MODEM "6.10.101.16"
#define SETUP_MODEM "driver modem/ssetup.exe"
#define NOME_TOUCH "Synaptics PS/2 Port Touchpad"
#define VERS_TOUCH "8.1.6.0"
#define SETUP_TOUCH "driver touchpad/Setup.exe"
#define NOME_WLAN "Intel PRO/Wireless 3945ABG"
#define VERS_WLAN "10.5.1.68 XP"
#define SETUP_WLAN "driver wlan/iProdifx.exe"


/*prova di stampa delle define
printf ("\n\n\nProva di stampa:");
printf ("\nNome driver video: %s",NOME_VIDEO);
printf ("\nVersione driver video: %s",VERS_VIDEO);*/

DWORD CodiceFiglio(int NumSetup);
/*serve per creare il processo figlio*/

char Vuoto[2];         /*permette di schiacciare il tasto Invio*/

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
{
    void InstallaDriver (void);
    /*serve a fare installare tutti i driver presenti nnella cartella*/
    
    int SceltaOperazione;  /*contiene il numero che indica l'operazione da fare*/
    
    printf ("\n\n\t\tSETUP DRIVER\n\n");
    
    printf ("\nScegliere cosa fare:");
    printf ("\ninstallare tutti i driver (1), installa un singolo driver (2), visualizzare le versioni dei driver (3), modificare le versioni dei driver (4).");
    printf ("\n\nDigitare la scelta:  ");
    scanf ("%d",&SceltaOperazione);
    
    if ((SceltaOperazione >4) || (SceltaOperazione<1))
    {
       printf ("\nERRORE: Comando errato. Verificare il numero inserito.\n\n\n");
    }
    if (SceltaOperazione==1)
    {
       printf ("\nHai scelto di installare tutti i driver presenti. Premi Enter\n");
       fgets (Vuoto,2,stdin);
       fgets (Vuoto,2,stdin);
       InstallaDriver ();
    }
    
    printf ("\nPremere il tasto 'Esc' per uscire dal programma.\n\n");
    getch();
    
    return(1);
}

void InstallaDriver()
{
    DWORD dwThreadId;
    DWORD dwThrdParam = 1;
    HANDLE thread;
    
    int NumSetup;     /*indica il numero del driver da installare*/
    
    printf ("\nN.B.: è consigliato, se richiesto, selezionare la casella \"Riavviare il computer in un secondo momento\" \nper permettere una installazione lineare di tutti i driver. Premi Enter.\n");
    fgets (Vuoto,2,stdin);
    
    for(NumSetup=0;NumSetup<2;++NumSetup)
    {
        thread = CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE)CodiceFiglio(NumSetup), &dwThrdParam, 0, &dwThreadId);
        CloseHandle(thread);
    }
    return;
}

DWORD CodiceFiglio(int NumSetup)
{
      /*Codice figlio*/
      printf ("\nSono nel figlio");
      
      if (NumSetup==0)
      {
         printf ("\nInstallazione \"%s\" in corso...",NOME_CHIPSET);
         spawnl(_P_WAIT,SETUP_CHIPSET,NULL);
      }
      if (NumSetup==1)
      {
         printf ("\nInstallazione \"%s\" in corso...",NOME_TOUCH);
         spawnl(_P_WAIT,SETUP_TOUCH,NULL);
      }
      
      return;
}

PM Quote
Avatar
bangirasu (Normal User)
Rookie


Messaggi: 39
Iscritto: 15/08/2007

Segnala al moderatore
Postato alle 15:01
Giovedì, 17/01/2008
Usare CreateThread non è proprio creare un processo figlio, anche dal nome si capisce che viene creato un thread e la funzione è molto simile alla funzione linux
Codice sorgente - presumibilmente C/C++

  1. pthread_create(&tid, attr, function, arg)


Io su Windows usando cygwin con l'ottimo mingw riesco ad usare la fork. Forse il tuo problema è che senza la libreria unistd.h non riesci ad usarlo...
Codice sorgente - presumibilmente C++

  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <sys/wait.h>
  4. #include <fcntl.h>
  5. #include <stdio.h>
  6. #include <unistd.h>
  7.  
  8. int main() {
  9.   int pid=fork();
  10.   int status;
  11.   if (pid==0) {
  12.     printf("Sono il figlio, il mio pid è: %d, il mio papi ha pid: %d\n", getpid(), getppid());
  13.     return 72;
  14.   } else {
  15.     printf("Sono il padre, il mio pid è: %d. ", getpid());
  16.     printf("L'exit di mio figlio (%d) è: %d\n",wait(&status), WEXITSTATUS(status));
  17.     return 15;
  18.   }
  19. }


Questo programma funziona perfettamente.
Questo è l'output:

Sono il figlio, il mio pid è: 2944, il mio papi ha pid: 2544
Sono il padre, il mio pid è: 2544. L'exit di mio figlio (2944) è: 72

Ciao

PM Quote
Avatar
Peppe91 (Member)
Rookie


Messaggi: 41
Iscritto: 09/04/2011

Segnala al moderatore
Postato alle 9:14
Lunedì, 27/06/2011
Testo quotato

Postato originariamente da andreamica:

come faccio a sapere qual'è il padre e quale il figlio?
ad esempio la fork ritornava 0 ke significava ke ero nel padre ed un numero diverso da 0 se ero nel figlio.
Questa funzione cosa ritorna?



Piccola correzione. Quando la funzione fork ritorna 0 significa che ha generato un processo figlio, non il padre. Quando ritorna un valore maggiore di zero significa che ha generato il padre. Altrimenti -1 se si è verificato un errore nella creazione del processo. :yup:

PM Quote
Avatar
Alex (Ex-Member)
Expert


Messaggi: 441
Iscritto: 15/08/2005

Segnala al moderatore
Postato alle 23:07
Martedì, 28/06/2011
Testo quotato

Postato originariamente da Peppe91:

Testo quotato

Postato originariamente da andreamica:

come faccio a sapere qual'è il padre e quale il figlio?
ad esempio la fork ritornava 0 ke significava ke ero nel padre ed un numero diverso da 0 se ero nel figlio.
Questa funzione cosa ritorna?



Piccola correzione. Quando la funzione fork ritorna 0 significa che ha generato un processo figlio, non il padre. Quando ritorna un valore maggiore di zero significa che ha generato il padre. Altrimenti -1 se si è verificato un errore nella creazione del processo. :yup:  



come fa a generare il padre? XD la fork quando ritorna un numero maggiore di 0 significa che siamo nel processo padre, e quel numero è il PID del figlio...ma la fork non genera nessun padre8-)8-)

PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo