Gestionnaire de signal de déclenchement pour les E / S

En utilisant C sous Linux, comment pourrais-je déclencher un gestionnaire de signaux chaque fois que j’écrirais des données dans un tampon en utilisant la fonction write (). Le gestionnaire lira toutes les données écrites dans la mémoire tampon au moment de l’exécution.

Les sockets prennent cela en charge en activant le mode async sur le descripteur de fichier de socket. Sous Linux, cela se fait en utilisant les appels fcntl:

/* set socket owner (the process that will receive signals) */ fcntl(fd, F_SETOWN, getpid()); /* optional if you want to receive a real-time signal instead of SIGIO */ fnctl(fd, F_SETSIG, signum); /* turn on async mode -- this is the important part which enables signal delivery */ fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_ASYNC); 

Utilisez pipe() avec O_ASYNC et vous recevrez un SIGIO à l’extrémité de lecture du tuyau à chaque nouvelle donnée.

Je ne comprends pas à 100% ce que vous essayez de faire, MAIS sélectionnez peut-être ce dont vous avez besoin. en attente d’écriture des données dans un fichier / canal. Vous pouvez l’utiliser pour faire / simuler des E / S asynchrones.

Si le descripteur de fichier utilisé avec write() n’est pas destiné à une FIFO, un tuyau ( comme suggéré par Ken Bloom ), un socket asynchrone ( comme suggéré par mark4o ), et ne crée pas de signal (par exemple, SIGIO ), je suppose que vous pourriez Utilisez raise() pour envoyer un signal au processus en cours après avoir écrit des données dans la mémoire tampon. Selon ce que vous essayez réellement d’atteindre, il se peut que ce ne soit pas la meilleure solution.


Mettre à jour

Si je vous ai bien compris, vous souhaitez écrire dans un fichier, générer un signal SIGIO à la fin de l’écriture, puis relire les données depuis le gestionnaire de signaux. Il semble que vous souhaitiez utiliser des E / S asynchrones pour un fichier.

Dans les E / S asynchrones sous Linux ou: Welcome to hell , l’auteur décrit diverses techniques d’E / S asynchrones sous Linux, notamment l’utilisation du signal SIGIO. La technique du signal SIGIO ne peut pas être utilisée avec des fichiers normaux.

Bien que l’auteur de l’article mentionné précédemment n’apprécie guère l’API POSIX AIO fournie dans le kernel 2.6, vous pouvez quand même vouloir l’examiner car il peut être utilisé pour notifier la fin de la lecture / écriture asynchrone à une base régulière. archiver des signaux et des rappels de fonction.

Dans Boost, pour les performances des applications utilisant des E / S asynchrones , l’auteur fournit une vue d’ensemble des modèles d’E / S Linux de base avant de présenter l’API AIO.