Comunicazione tra processi in windows

di il
4 risposte

Comunicazione tra processi in windows

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=&pi;
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();
}

4 Risposte

Devi accedere o registrarti per scrivere nel forum
4 risposte