2016-04-24 1 views
1

J'ai un code qui dans un certain temps fourche un enfant. Le code enfant seul est un scanf. Le processus parent doit surveiller l'état du processus enfant tis: 1) en cours d'exécution 2) attente d'entrée dans scanf 3) à terminaisonVérifie si un PID enfant attend un Scanf

Vérifier la terminaison ou non est simples avec waitpid et WNOHANG. Le problème est que je ne sais pas comment distinguer si le processus de l'enfant attend l'entrée ou non. PS: Mon cas est limité par le fait que je ne peux pas envoyer d'informations de l'enfant à son parent. Sinon, je pourrais juste utiliser des variables avant et après le scanf.

PS .: Je suis sous linux

Comment puis-je vérifier si un processus enfant est entré dans un état d'attente d'une entrée de scanf (ou IO en général)?

+0

Ce serait mieux si vous expliquiez ce que vous essayez d'atteindre. C'est une chose étrange à vouloir faire, donc il y a probablement une meilleure solution pour le problème que vous voulez résoudre. –

+0

Je vais modifier. Merci pour le conseil. – Psyny

Répondre

1

Les concepts de processus et IO sont généralement disjoints. Il n'y a pas de signaux qui sont échangés entre les processus enfant et parent, à l'exception des signaux unix (kill) envoyés au pid parent, qui se propagent aux enfants. Waitpid attend juste la fin d'un pid enfant, en retournant son code d'état.

Si vous souhaitez échanger des données entre parent et enfant, vous devez créer un pipe (voir man -s 2 pipe) entre les deux processus, voir la page de manuel pour un exemple.

Si vous souhaitez utiliser scanf (entrée à partir de) chez l'enfant, vous devez lier le pipefd[0] au descripteur de fichier stdin 0 (ou STDIN_FILENO).

Vous pouvez maintenant utiliser select ou poll dans le processus parent pour vérifier si l'enfant est prêt à lire les données envoyées par le parent à pipefd[1].

Si vous utilisez printf ou une autre méthode stdio.h écrire à l'enfant (via STDOUT_FILENO par exemple), l'IO sur le parent pourrait bloquer toute façon, même si select ou poll dit que l'enfant est prêt à recevoir les données, si l'enfant lit trop lentement ou arrête de lire trop tôt et que le tampon de sortie est plein (qui a une taille par défaut de 4096 octets, je pense).

Un unistd.h appel d'écriture peut retourner une valeur

nw = write(pipefd[1], buffer, nbytes); 

nw < nbytes si l'enfant n'a pas lu que beaucoup (nbytes) octets d'entrée.

Soyez donc attentif aux risques de chute lors d'une communication asynchrone. Vérifiez la méthode CSP (Communicating Sequential Processes) comme une approche différente et plus stable de la communication, qui utilise la communication synchrone, lorsque vous avez compris les méthodes asynchrones.

+0

Merci pour la solution. J'ai testé des testicules avec des pipes et cela semble résoudre mon problème. De plus, mon concept d'IO et de processus était erroné, et cette réponse m'a aidé à organiser mes pensées. – Psyny

1

Utilisez-vous <Windows.h>? Est-ce ce que vous essayez de trouver?

WaitForInputIdle

attend que le processus spécifié a fini de traiter son entrée initiale et est en attente d'une entrée d'utilisateur sans entrée en attente, ou jusqu'à ce que l'intervalle de temps est écoulée.

HANDLE hProc; 
// get hProc here 
WaitForInputIdle(hProc, INFINITE); // wait forever until input idle 
// do something here 

Plus d'informations sur l'API peut être trouvée ici: https://msdn.microsoft.com/en-us/library/windows/desktop/ms687022(v=vs.85).aspx

+0

Désolé je n'ai pas défini. Je suis sous Linux. Je vais essayer de trouver un équivalent, merci! – Psyny