Domanda

Sono un po 'principiante su C ++ e sto lavorando a un semplice programma su Linux che dovrebbe invocare un altro programma nella stessa directory e ottenere l'output del programma invocato senza mostrare l'output del programma invocato sulla console. Questo è il frammento di codice su cui sto lavorando:

    pid_t pid;
    cout<<"General sentance:"<<endl<<sentence<<endl;
    cout<<"==============================="<<endl;
    //int i=system("./Satzoo");
    if(pid=fork()<0)
        cout<<"Process could not be created..."<<endl;
    else
    {
        cout<<pid<<endl;
        execv("./Satzoo",NULL);
    }
    cout<<"General sentance:"<<endl<<sentence<<endl;
    cout<<"==============================="<<endl;

Uno dei problemi che incontro è che sono in grado di stampare le prime due righe sulla console ma non riesco a stampare le ultime due righe. Penso che il programma smetta di funzionare quando invoco il programma Satzoo. Un'altra cosa è che questo codice invoca due volte il programma Satzoo, non so perché? Posso vedere l'output sullo schermo due volte. D'altra parte, se uso System () invece di Execv (), allora il satzoo funziona solo una volta.

Non ho capito come leggere l'output di Satzoo nel mio programma.

Qualsiasi aiuto è apprezzato.

Grazie

È stato utile?

Soluzione

Non ti distingue tra il bambino e il processo genitore dopo la chiamata a fork(). Quindi sia il figlio che il genitore corrono execv() e quindi le loro rispettive immagini di processo vengono sostituite.

Vuoi qualcosa di più simile:

pid_t pid;
printf("before fork\n");

if((pid = fork()) < 0)
{
  printf("an error occurred while forking\n");
}
else if(pid == 0)
{
  /* this is the child */
  printf("the child's pid is: %d\n", getpid());
  execv("./Satzoo",NULL);
  printf("if this line is printed then execv failed\n");
}
else
{
  /* this is the parent */
  printf("parent continues execution\n");
}

Altri suggerimenti

Il fork() La funzione clona il processo corrente e restituisce diverso valori in ogni processo. Nel processo "genitore", restituisce il PID del bambino. Nel processo figlio, restituisce zero. Quindi normalmente lo invocheresti usando un modello come questo:

if (fork() > 0) {
    cout << "in parent" << endl;
} else {
    cout << "in child" << endl;
    exit(0);
}

Ho omesso la gestione degli errori in quanto sopra.

Nel tuo esempio, entrambi i percorsi del codice sopra (sia genitore che figlio) cadono nel else clausola della tua chiamata a fork(), causando entrambi execv("./Satzoo"). Ecco perché il tuo programma funziona due volte e perché non raggiungi mai le dichiarazioni oltre.

Invece di usare fork() e fare tutto manualmente (gestire correttamente l'esecuzione del processo è una buona quantità di lavoro), potresti essere interessato a utilizzare il popen() funzione invece:

FILE *in = popen("./Satzoo", "r");
// use "in" like a normal stdio FILE to read the output of Satzoo
pclose(in);

Dal fork() MANPAGE:

VALORE DI RITORNO
Al completamento con successo, FORK () restituirà 0 al processo figlio e restituirà l'ID processo del processo figlio al processo genitore. Entrambi i processi devono continuare a eseguire dalla funzione fork (). Altrimenti, -1 deve essere restituito al processo genitore, non è stato creato alcun processo figlio e Errno deve essere impostato per indicare l'errore.

Controlli per assicurarti che abbia successo, ma non se il pid indica che siamo nel figlio o nel genitore. Pertanto, sia il bambino che il genitore fanno la stessa cosa due volte, il che significa che il tuo programma viene eseguito due volte e il testo finale non viene mai stampato. È necessario controllare il valore di ritorno di fork() Più che una volta.

Exec - La famiglia di funzioni Exec () sostituisce l'immagine di processo corrente con una nuova immagine di processo.

Sistema: blocca l'esecuzione del comando. L'esecuzione del programma di chiamata continua dopo il ritorno del comando di sistema

Ci sono tre test del valore di ritorno che desideri con Fork

  1. 0: sei il bambino
  2. -1: errore
  3. Altro: sei il genitore

Hai gestito l'altro programma sia dal figlio che dal genitore ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top