Visualizzazione dei risultati da 1 a 3 su 3

Discussione: [C++] Create process

  1. #1

    [C++] Create process

    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

  2. #2
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    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()
    codice:
    #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;
         }
    
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.