Domanda

Sto cercando di creare un processo figlio in un altro processo. Sto scrivendo sia i programmi in linguaggio C. Prima scrivo un processo fittizio che sarà il processo figlio. Quello che sta facendo è solo per scrivere una stringa sullo schermo. Funziona bene da solo. Poi scrivo un altro programma che sarà il processo padre. Tuttavia, non posso farlo accadere. Sto cercando di usare la forchetta e funzioni execl insieme, ma non riesco. Voglio anche il processo figlio non termina fino a quando il processo padre termina.

Come dovrei scrivere il processo padre?

Grazie.

Ecco il codice per il processo figlio:

#include <stdio.h>

int main(void) {
  while(1) {
    printf("*");
    sleep(1);
  }
}

E qui è il processo padre:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void) {
  if (fork()) {
    while(1) {
      printf("-\n");
      sleep(5);
    }
  } else {
    execl("./", "dummy", (char *)0);
  }
}
È stato utile?

Soluzione

La chiamata di sistema fork () può restituire tre diversi stati: il fallimento (<0), processo genitore (> 0) o un bambino di processo (== 0). È necessario testare adeguatamente il valore di ritorno.

int pid = fork();

if (pid < 0) {
  /* handle error */
  perror("fork");
  exit(1);
} else if (pid > 0) {
  /* parent code */
} else {
  /* child code */
}

Il tuo execl () chiamata di sistema è sbagliato. Il primo argomento è il percorso del programma che si vuole eseguire, "./" non è valido, dovrebbe essere qualcosa come "./dummy" almeno. L'argomento successivo è per convenzione il nome del comando (argv [0] nel programma eseguito), che può essere una ripetizione del primo argomento. Quindi:

execl("./dummy", "dummy", NULL);

Si noti inoltre che la dichiarazione printf("*") nel programma bambino probabilmente tampone e non si vede nulla sul terminale. o È necessario aggiungere un "\ n" alla fine o chiamare fflush(stdout) per svuotare lo standard output.

Altri suggerimenti

l'uso di base della forcella in C

int PID = fork();

if( PID < 0 ) {
    //fail
    return PID;
}
else if( !PID ) {
    //child process
    return exec( prog, args );
} 
else {
    //parent process
    return 0;
}

Non v'è alcun modo per forzare il processo figlio "non terminare" quando è fatto (sarete ancora in grado nel genitore per wait per esso per ottenere informazioni su come si conclude, ma che su di esso). Oltre a questo, uno dei tanti esempi di fork / exec sul web, come questo uno , dovrebbe funzionare - perché non provare e vedere se si comporta come si desidera (nel qual caso ti basta cambiare tutto ciò che stavi facendo in modo diverso nel vostro tentativo). Se non funziona, se lo desideri (tranne che per l'impossibilità per la prima frase di questo A ;-), si prega di modificare il aggiungere copiosa dettagli su come il codice si comporta in modo diverso di quanto si aspetta.

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