-1
votes

Pourquoi l'enfant de cette classe n'imprime-t-il pas?

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> xxx pré>

cuisine.hpp p> xxx pré>

réception.cpp p> xxx pré>

réception.hpp p> xxx pré>

main.cpp

int main(void)
{
    Reception reception;
    return (reception.run_shell());
}


5 commentaires

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?"


3 Réponses :


0
votes

Le dernier d'autre manque d'accolades bouclées, WaiterPID (ceci -> _ pid, wstatus, 1); est exécuté par enfant et parent ...


1 commentaires

Cela a été corrigé, ce n'était pas la source du problème



0
votes

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.

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.


5 commentaires

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.



1
votes

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 ***


1 commentaires

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.