J'essaie de créer un programme qui imite un shell Linux.Comment puis-je terminer le programme lorsque je n'attends pas le processus fils dans le parent?
Et il fonctionne en deux modes
(1) Mode interactif (Aucun) arguments
Attendez que le processus enfant. Exécute une commande à la fois.
(2) mode batch (Un fichier donné)
Ne pas attendre. Essayez d'exécuter les commandes en parallèle. Mon code est assez long donc j'ai décidé de faire un exemple de programme pour adresser (focus) sur le problème que je suis confronté.
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
struct commands
{
char *cmd[2];
};
int main(int argc, char *argv[])
{
printf("A program made to understand execvp\n");
commands threeCommands[3];
pid_t process;
int child_status;
threeCommands[0].cmd[0] = "date";
threeCommands[0].cmd[1] = NULL;
threeCommands[1].cmd[0] = "pwd";
threeCommands[1].cmd[1] = NULL;
threeCommands[2].cmd[0] = "cal";
threeCommands[2].cmd[1] = NULL;
for(int i = 0;i <3;i++)
{
process = fork();
if(process == 0)
{
execvp(threeCommands[i].cmd[0],threeCommands[i].cmd);
}
else
{
//wait(&child_status);
}
}
return 0;
}
Comme vous pouvez le voir, je suis Décommenter l'attente pour que j'essaie de faire le traitement simultané et les résultats des commandes sont répartis au hasard et peut-être entremêlées.
Le problème est après l'exécution des trois commandes date,pwd,cal
Le programme ne se termine pas. Il gèle dans cet état et ne se termine pas simplement, donc mon curseur est là comme s'il avait besoin d'une entrée. Et mon programme ne se termine pas. Comment puis-je réparer cela?
Dois-je tuer ou quoi?
En fait, on n'a pas * besoin * d'appeler 'wait' pour récolter les processus fils, même si c'est" de bonnes manières "de le faire. Si un processus fils devient orphelin (lorsque ses parents se terminent sans attendre que l'enfant sorte), le processus init (pid 1) prendra le relais en tant que parent.Un processus de zombie est un processus qui s'est terminé mais qui n'a pas été récolté oui (c'est-à-dire que le parent n'a pas appelé 'wait'). –