La creazione di un processo figlio su sistemi Unix?
-
22-09-2019 - |
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);
}
}
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.