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.
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. –
Je vais modifier. Merci pour le conseil. – Psyny