PDA

Visualizza la versione completa : [C++] Create process


Giovanni Pr88
04-11-2010, 11:52
Ciao a tutti
Vorrei sapere se qualcuno sa come funziona la funzione create process. Ho cercato sul web ma le spiegazioni non mi sono state per niente chiare.
Dopo aver chiamato una console che emula linux mediante la funzione system, vorrei farle svolgere il comando cd "cartella" per spostarmi tra le varie cartelle senza digitare niente.
Credo si debba usare la funzione create process. Qualcuno può confermare?!
Sto tentanto di fare una cosa realizzabile?!
Un saluto a tutti

MItaly
04-11-2010, 15:22
Secondo me hai intrapreso una via stramba per fare quello che vuoi fare. Spiega il problema generale da capo, molto probabilmente c'è un'altra via.

Giovanni Pr88
04-11-2010, 16:12
Ci sono riuscito.
Comunque provo a spiegarti.
Io lancio il mio programma in c++. Ad un certo istante del mio programma faccio generare un processo figlio mediante la funzione CretaProcess() il quale non è altro che la mia console cygwin. In questo modo ho due schermate.
Una che contiene il mio programma con la shell di dos e la mia shell cygwin.
Il prossimo obiettivo sarà quello di far inviare dal mio programma c++, delle istruzioni alla mia console cygwin.
Mi sono spiegato bene?! :)
Eccoti il codice che ho fatto finora.
Praticamente tutto il programma si trova nella funzione void nuovoprofilo()


#include <iostream>
#include <stdlib.h>
#include <fstream>
#include <windows.h>
#define MAX 50
using namespace std;
char nome_cognome[MAX];
void nuovoprofilo();

int main()
{
char ch;
cout << "Nuovo (n), Salvare (s) Lanciare (r) Uscire (q)" << endl;
cin >> ch;
while (ch!='q')
{
switch (ch)
{
case 'n':
nuovoprofilo();
break;
case 's':
//salvaprofilo();
break;
case 'r':
//lanciaprofilo();
break;
default : cout << "Nuovo (n), Salvare (s) Lanciare (r) Uscire (q)" << endl;
}
cin >> ch;
}
return 0;
}


void nuovoprofilo()
{
cout << "Inserire nome e cognome" << endl;
cin.getline(nome_cognome,MAX); //perchè non funziona?!
cin.getline(nome_cognome,MAX);
system("\"mkdir C:\\cygwin\\home\\Ciucci\\voxforge_2\"");
system("\"mkdir C:\\cygwin\\home\\Ciucci\\voxforge_2\\HTK_Scripts\"");
system("\"xcopy C:\\cygwin\\home\\Ciucci\\voxforge\\HTK_Scripts C:\\cygwin\\home\\Ciucci\\voxforge_2\\HTK_Scripts\"");
system("\"mkdir C:\\cygwin\\home\\Ciucci\\voxforge_2\\auto\"");
ofstream fout ("C:\\cygwin\\home\\Ciucci\\voxforge_2\\auto\\sample .grammar");
fout << "S : NS_B COMANDO OGGETTO NS_E" << endl << "S : NS_B RICHIESTA NS_E" << endl;
fout.close();
ofstream fout2 ("C:\\cygwin\\home\\Ciucci\\voxforge_2\\auto\\sample .voca");
fout2 << "% NS_B" << endl << "<s> sil" << endl << endl << "% NS_E" << endl << "</s> sil" << endl << endl << "% COMANDO" << endl << "ACCENDI a cc e n d i" << endl << "SPEGNI s p e ggn i" << endl << endl << "% OGGETTO" << endl << "LUCE l u c e" << endl << "TEIERA t e j e r a" << endl << endl << "% RICHIESTA" << endl << "AIUTO a j u t o" << endl;
fout2.close();

BOOL esito;
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si)); // serve per azzerrare la struttura si
si.cb = sizeof(si); // il campo cb deve essere valorizzato alla dimensione
// della struttura
si.lpTitle = "Processo figlio Cygwin.bat (applicazione console)";
// crea il processo figlio
esito = CreateProcess(
NULL, // nome dell'eseguibile (viene usata la riga di comando)
"C:\\cygwin\\Cygwin.bat", // riga di comando (se assente viene usato il nome eseguibile
NULL, // indica che il processo non è ereditabile dai processi figli
NULL, // indica che il thread associato al processo non è ereditabile
FALSE, // i diritti ereditati dal processo non passano ai figli
CREATE_NEW_CONSOLE + NORMAL_PRIORITY_CLASS, // opzioni di creazione
// (0 per nessuna); in questo caso imposto priorità e creazione
// del processo figlio in una nuova finestra console
NULL, // puntatore ad un blocco di variabili d’ambiente.
// in questo caso vengono usate quelle del padre.
NULL, // directory di lavoro per il processo figlio.
// In questo caso viene usata la directory corrente del processo padre
&si, // puntatore ad una struttura STARTUPINFO
&pi // puntatore ad una struttura PROCESS_INFORMATION
);
if (esito == TRUE)
{
cout<<"Processo creato regolarmente"<<endl;
}
else
{
cout<<"CreateProcess fallito!"<<endl;
}

}

Loading