2017-04-07 3 views
0

J'ai ce petit programme:Comment faire pour que les enfants 'fork()' ed partagent stdin?

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/wait.h> 

int main() { 
    int orig = 1; 
    for (int i = 0; (i != 3) && orig; ++i) { 
     orig = orig && fork(); 
    } 
    if (orig) { 
     for (int i = 0; i != 3; ++i) { 
      wait(NULL); 
     } 
    } else { 
     int num; 
     scanf("%d", &num); 
     printf("%d\n", num*num); 
    } 
} 

qui est censé simplement trois numéros carrés qu'il lit à partir stdin, mais il ne fonctionne pas comme prévu. , Il semble plus particulièrement comme l'un des enfants « porcs » tous l'entrée ted cat, puisque le programme fait à peu près ceci:

2 
2 
2 

à

4 
0 
0 

Je pense que je dois utiliser dup pour fixer Ceci, mais il n'y a presque rien dans nos supports de cours, et tout ce que je trouve sur le web est trop compliqué à comprendre pour moi. Comment puis-je faire en sorte que tous les processus se partagent stdin?

+0

'dup()' ne va pas aider. Il fallait synchroniser les enfants et lire des lignes entières de chaque ... beaucoup plus facile à lire stdin avant de bifurquer –

+0

Cela ressemble à une très mauvaise idée, même si possible. Qui un processus connaîtrait l'entrée est destinée à ce processus? Utilisez un seul processus pour envoyer l'entrée à chacun des travailleurs au lieu! – Olaf

+0

Umm .. tu veux dire comme «Comment puis-je faire deux trains partagent la même piste? – ThingyWotsit

Répondre

0

Comment faire pour que les enfants 'fork()' ed partagent stdin?

Sauf si vous faites des dispositions pour l'éviter, les enfants font parts stdin. Mais ils partagent le flux lui-même, qui est juste un conduit pour les octets. Les données transitant par le flux ne font pas partie du flux.

Plus précisément, il semble que l'un des enfants "porcs" tous l'entrée catted,

Oui. Ce comportement spécifique n'est pas garanti, mais il est plausible et en fait probable. Un seul processus peut lire chaque octet - ce qui supprime l'octet du flux, de sorte qu'il n'est pas disponible pour les autres processus. Il y a quelques petits détails autour de l'interaction de tamponner et de forking qui pourraient dans certaines circonstances produire une apparence de comportement différent, mais éviter de telles complications est important.

Vous avez besoin d'un modèle de communication différent. Voici quelques-unes des alternatives les plus plausibles:

  • Pré-lecture. Le processus d'origine lit toutes les données nécessaires du flux et les enregistre en mémoire. Chaque enfant fork() hérite d'une copie des données à utiliser.

  • Multiplexage d'entrée. Le processus principal ou un processus supplémentaire mis en place prend en charge la lecture de stdin. Il transmet tout ce qu'il lit à chacun des autres processus via des tuyaux (un pour chacun des trois enfants d'origine)

  • Bus d'entrée. Les processus enfants sont connectés ensemble via des canaux (qui peuvent être configurés sur leurs flux standard si vous le souhaitez); quelles que soient les données qu'ils lisent, ils les transmettent aussi à l'enfant suivant par-dessus la pipe, en plus d'effectuer leur travail régulier.

0

Un seul processus enfant lit depuis stdin et vide le tampon d'entrée du fichier, il n'est pas automatiquement envoyé à TOUS les enfants. Voir Reading from stdin by multiple processes pour un scénario similaire; Veuillez noter que scanf utilise aussi l'entrée tamponnée FILE *, donc la conclusion est la même.

Ce doit être le parent qui lit puis envoie les données d'entrée à tous les enfants, un par un.