Question

J'ai quelques questions de base sur les tuyaux, je suis pas sûr.

a) Quel est le comportement standard si une écriture de processus à un tuyau est tué (ie. SIGKILL SIGINT)-t-il fermer le tuyau? EAUX USEES le tuyau? Ou est le comportement indéfini?

b) Quel est le comportement standard si un processus retourne normalement? Est-il garanti pour rincer le tuyau et fermer le tuyau? (Sans faire explicitement bien sûr).

Je voudrais que ces réponses soient aussi général que possible, mais en réalité, si elle dépend entièrement des spécifications OS je peux accepter ça! Cependant, s'il existe une norme Posix ou un comportement de Windows défini actuellement, je serais très reconnaissant de savoir.

Merci.

Était-ce utile?

La solution

  

a. Quel est le comportement standard si une écriture de processus à un tuyau est tué (ie. SIGKILL SIGINT)-t-il fermer le tuyau? EAUX USEES le tuyau? Ou est le comportement indéfini?

SIGKILL permet jamais de nettoyage - le processus meurt, mort. Avec SIGINT, cela dépend si le processus gère le signal. Dans ce cas, il est susceptible de sortir par la sortie (2), qui débusque les descripteurs de fichiers E / S standard. La question est - est le tuyau relié à la sortie standard ou via popen ()? Dans ce cas, les données mises en mémoire tampon en cours peuvent être vidées; sinon, il n'y a pas de données en mémoire tampon si le rinçage est sans importance.

En cas de données non lues dans la conduite, que les données restent dans le tuyau, prêt pour le lecteur à recueillir -. En supposant qu'il existe un lecteur

  

b. Quel est le comportement standard si un processus retourne normalement? Est-il garanti pour rincer le tuyau et fermer le tuyau? (Sans faire explicitement bien sûr).

Il dépend du fait que le tuyau est relié par l'intermédiaire d'E / S standard ou non. Sinon, il n'y a rien en attendant. Si oui, alors oui, tout matériel dans les tampons sera rincée que le flux E / S standard est fermé.


  

c. Merci pour les informations sur les signaux et les données non lues, mais je suis un peu confus au sujet de la connexion du tuyau d'E / S standard. Après avoir mentionné popen () Je l'ai regardé et la page de manuel dit sa valeur de retour identique à un flux d'E / S et les cours d'eau sont mises en mémoire tampon entièrement par défaut. Je ne suis pas clair sur la différence entre les deux et je ne comprends la différence vient.

L'appel système de base pour créer des tuyaux est pipe(2). Il crée deux descripteurs de fichiers, un pour la fin lecture du tube, un pour la fin d'écriture. Si vous ne faites rien d'autre avec eux, ils restent comme descripteurs de fichiers, avec sortie unbuffered (via écriture (2) et les appels système connexes). Si le processus se termine, il n'y a pas mise en mémoire tampon dans l'application; le tuyau est fermé.

Si vous utilisez popen(3), il fait beaucoup plus de travail pour vous. Il invoque encore pipe(2) pour créer les tuyaux, mais il fait alors un fork(2). L'enfant dispose de la configuration correcte des tuyaux et lance le processus d'enfant. Le parent ferme également l'extrémité non utilisée de la canalisation, et utilise fdopen(3) pour créer un flux de fichier standard E / S pour le processus appelant à utiliser.

Avec le flux de fichiers, s'il y a des données dans le tampon d'E / S, puis un proche ou équivalent veillera à ce que les données en circulation est rincée et le descripteur de fichier est fermé.

Autres conseils

Le comportement normal est que tous les descripteurs de fichiers sont fermés lorsqu'un processus se termine. Cela signifie qu'un tuyau, comme tout autre descripteur de fichier ouvert, est fermé normalement.

Une chose intéressante à propos de tuyaux, cependant: dans Posix, si un processus écrit à un tuyau qui a été fermé, l'écrivain recevra un signal SIGPIPE.


Edit:

Une mise en garde: La différence entre s fin SIGx et une terminaison normale est que, comme toute autre écriture de fichiers, vous risquez de perdre des données qui a été tamponné (via une écriture de fichier) et non encore écrit au descripteur de fichier

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top