Ciao a tutti.
Io vorrei realizzare una comunicazione tra due processi.
Mi spiego.
Il mio programma c++ arriva alla funzione createprocess() dove mi apre un altro programma (cygwin) che emula la console di linux. Io vorrei fare in modo che, dal mio programma c++, possa inviare i comandi alla mia console e quest ultima li dovrebbe eseguire. Ad esempio.
Nel mio programma c++ arrivo ad un certo momento in cui invio il comando cd .. alla mia console. La mia console riceve il comando e lo esegue.
Mi sono spiegato?!
So dell'esistenza della funzine createpipe ma sul sito msdn non è spiegata benissimo. Anzi, non ho capito assolutamente niente riguardo al suo utilizzo.
Qualcuno mi può aiutare?!
è da una settimana che non riesco più ad andare avanti
Ecco il mio codice
#include <iostream>
#include <stdlib.h> //Necessaria per utilizzare system
#include <fstream> // Necessaria per utilizzare apertura e scrittura dei file
#include <windows.h> // Necessario per createprocess() e createpipe()
#define MAX 50
using namespace std;
void nuovoprofilo();
char nome_cognome[MAX];
int PIDpadre, PID, PIDfiglio;
int main()
{
char ch;
cout << "Nuovo (n), Salvare (s) Lanciare (r) Uscire (q)" << endl;
//gestione pressione tasti sbagliati
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()
{
cin.get();
cout << "Inserire nome e cognome" << endl;
cin.getline(nome_cognome, MAX);
//Cartelle con nome profilo!
cout<<"DEBUG: creo le cartelle utili"<<endl;
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\"");
//PIDpadre=GetCurrentProcessId();
BOOL esito;
STARTUPINFO si;
STARTUPINFO *psi;
PROCESS_INFORMATION pi;
PROCESS_INFORMATION *ppi; //Puntatore alla mia struttura
ppi=π
psi=&si;
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";
psi=&si;
// crea il processo figlio, ovvero lancia cygwin
esito = CreateProcess
(
NULL, // nome dell'eseguibile (viene usata la riga di comando)
"C:\\cygwin\\Cygwin.bat", // percorso del programma che voglio eseguire
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
psi, // puntatore ad una struttura STARTUPINFO
ppi //puntatore ad una struttura PROCESS_INFORMATION
);
if (esito == TRUE)
{
cout<<"Processo creato regolarmente"<<endl;
}
else
{
cout<<"CreateProcess fallito!"<<endl;
}
cout << "DEBUG: Il PID di cygwin è " << ppi->dwProcessId<<endl; //dovrebbe restituirmi il pid della console cygwin ma non lo fa
PIDfiglio=ppi->dwProcessId;
cout << "DEBUG: Il pid del mio file tesi.exe è " << GetCurrentProcessId()<< endl; //mi restituisce il PID del processo chiamante
PIDpadre=GetCurrentProcessId();
}