J'ai fait une classe censée gérer une sous-processus, mais quand je pose une impression de test à l'intérieur de rien ne se passe, peut-on me dire pourquoi?
J'ai essayé différents types d'impression et combinaisons de fflush mais il n'a pas fait " t résoudre le problème. p>
Voici mes fichiers: p>
kitchen.cpp p> cuisine.hpp p> xxx pré> réception.cpp p> réception.hpp p> main.cpp int main(void)
{
Reception reception;
return (reception.run_shell());
}
3 Réponses :
Le dernier d'autre manque d'accolades bouclées, WaiterPID (ceci -> _ pid, wstatus, 1); code> est exécuté par enfant et parent ... P>
Cela a été corrigé, ce n'était pas la source du problème
Le processus des parents doit être dit d'attendre que tout processus d'enfant achète. J'ai remarqué que votre condition finale ne manque pas les parenthèses de sorte que seule la ligne d'une ligne après l'exécution de l'autre. P>
L'autre problème est le pointeur wstatus. Parce que c'est un pointeur qui n'est pas initialisé, je ne suis pas sûr que le comportement sera exprimé. Changez-le à un Int et dans l'appel de Patind, utilisez et wstatus. P>
C'était une erreur, cela a été corrigé et n'était pas la source du problème
J'ai également essayé cela aussi, ce n'est pas le problème non plus, mais j'ai modifié ma réponse afin de préciser que le code fonctionne en dehors de la classe afin que le problème puisse se préparer à l'intérieur d'une classe.
En utilisant la flèche, vous impliquez que vous utiliserez des pointeurs vers un objet de cuisine. Je soupçonne que le même problème se pose ici avec des pointeurs qui ne sont pas initialisés. Pouvez-vous remplacer tous les pointeurs avec le type de données statique et le test? Vous avez dit que le code fonctionne en dehors de la classe, c'est donc la seule autre question que je puisse voir.
Il y a eu quelques mises à jour de la question, vous voudrez peut-être la lire à nouveau.
Je ne peux pas expliquer l'erreur post, mais j'ai soumis un code que "Fourches" dans une fonction de classe et qui semble compiler et fonctionner.
est-ce mieux maintenant? P>
oui, mieux. P>
J'ai copié votre code à My Lubuntu 18.04, et utilisez g ++ 7.3.0-27, a eu la chose à compiler. p>
Le code copié sur mon système reproduit votre erreur. strong> p>
hmmm. P>
Donc, je suis allé chercher et j'ai rapidement trouvé, ma dernière expérience de fourchette. Je ne comprends pas pourquoi cela fonctionne, et le vôtre ne le fait pas, ils ont l'air assez similaire pour moi. P>
J'utilise un commutateur au lieu de votre imbriquée si, alors-ele-ele-else, il existe peut-être un problème dans le niché si-alors-d'autre? un transfert de caractère défectueux? Mais j'en doute. P>
donc ... pour des raisons pragmatiques, je (minimalement?) A changé votre code pour faire correspondre mon exemple. P>
Peut-être que vous pouvez poser une meilleure question. pourquoi cela semble fonctionner et dans votre version ne le fait pas. P>
espère que cela aide: p>
xxx pré> sortie typique: p>
i am parent, child_pid: 6727 i am child: 0 parent 1 child 1 parent 2 child 2 parent 3 child 3 parent 4 child 4 parent 5 child 5 parent 6 child 6 parent 7 child 7 parent 8 child 8 parent 9 child 9 parent 10 child 10 parent 11 child 11 parent 12 child 12 parent 13 child 13 parent 14 child 14 parent 15 child 15 parent 16 child 16 parent 17 child 17 parent 18 child 18 *** Child complete *** parent 19 parent 20 parent 21 parent 22 parent 23 parent 24 parent 25 parent 26 parent 27 parent 28 *** Parent complete ***
Le destructeur tuant l'enfant semblait être le problème, une fois que le signal de tuer a été supprimé, il a fonctionné comme prévu.
Avez-vous essayé de déboguer?
J'essayais bien que je n'utilise pas de GDB très souvent et je ne suis pas sûr de ce que cela me dit surtout avec plusieurs processus
Vous avez étiqueté ce message sous le nom de C ++, qui a des fils et une jointure, mais pas de la fourchette ni de la peluche, (et pourquoi le printf?) Il y a des moments où vous devez utiliser ces * appels inux, comme lorsque vous avez des exigences pour les conserver, ou vos efforts sont "nourrir" un peu de code antique pour durer un peu plus longtemps. Mais pas pour de nouveaux efforts, pas pour apprendre C ++. Kudo est sur "la cuisine de classe" (qu'est-ce que peu nous y verrons). Cependant, un exemple de reproductible minimal doit compiler.
@ 2785528 C'est mieux maintenant?
Gestion des exceptions dans un CTor (c'est-à-dire Cuisine :: Cuisine), comme «Fork échoue» (pour une raison quelconque) peut être un défi, comme un statut de «retour» de CTOR. Des exceptions au cours de la CTOR devraient quitter la classe dans un état connu (? Je ne sais pas comment, mais affirme fonctionne pour moi;) Je pense que la Convention dans cette situation est que vous devriez séparer la fourchette () à une autre fonction. Je n'ai pas essayé et je vous assignerai la recherche "Comment gérer une exception ctor?"