Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
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:
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);
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.
/*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();
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);
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);
}
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++
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++
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
int main(){
int pid=fork();
int status;
if(pid==0){
printf("Sono il figlio, il mio pid è: %d, il mio papi ha pid: %d\n", getpid(), getppid());
return72;
}else{
printf("Sono il padre, il mio pid è: %d. ", getpid());
printf("L'exit di mio figlio (%d) è: %d\n",wait(&status), WEXITSTATUS(status));
return15;
}
}
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
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.
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.
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 padre