7
votes

Comment utiliser LSOF (liste des fichiers ouverts) dans une application C / C ++?

Y a-t-il un moyen d'obtenir toutes les prises ouvertes à l'aide de ? Je connais la commande lsof et c'est ce que je cherche, mais comment l'utiliser dans un application?

L'idée est d'obtenir la FD d'une prise ouverte par son numéro et le code pid .


0 commentaires

5 Réponses :


2
votes

1 commentaires

L'URL semble être invalide



3
votes

Si vous ne voulez pas copier / coller ou réimplément des morceaux du code LSOF, vous ne construisez aucune bibliothèque utile que vous pouvez exploiter, vous pouvez toujours ouvrir un tuyau à un lsof processus et parcourir sa sortie.


3 commentaires

Merci beaucoup, ce sera ma solution de plan-b, de la solution de Billy échoue pour une raison quelconque.


@Kiril: L'essentiel peut être une portabilité. LSOF agendra comment obtenir les données sur une grande variété de systèmes, dont certaines ne fournissent / PROC, et même parmi lesquelles le contenu de / processus peut différer. Néanmoins, si vous n'avez pas besoin de beaucoup de portabilité, puis découpez LSOF en fera beaucoup plus rapidement, et probablement plus simple.


Je n'ai pas besoin de beaucoup de portabilité, l'application n'est censée fonctionner que pour Rhel 4 et 5. Oui, j'ai choisi la réponse de Billy en raison de la performance. En outre, qu'est-ce qui me dérange, c'est que si la version de LSOF est différente de la version, je passe des problèmes, il pourrait y avoir des problèmes avec l'analyse. Mais je vais mettre en œuvre ceci, au cas où la première manière échoue, je vais donc utiliser les deux.



4
votes

Ouvrez simplement les fichiers In / Proc / Net, comme / Proc / Net / TCP, / Proc / Net / UDP, etc. Pas besoin de faire connaître les sources LSOF. :)


2 commentaires

Et comment puis-je faire le port de mappage: FD de / proc / net / TCP? Je ne vois pas de telles informations là-bas


Le port est codé hexadé après le : de la local_address et de la télécommande in / proc / net / TCP. Vous devez ensuite numériser tout / proc / * / fd à l'aide de readlink () et d'analyser le numéro de ce symbolique, par exemple. Socket: [1771485] 1771485 est le numéro de l'inode et vous constaterez que le numéro d'inode IN / PROC / NET / TCP (ou tout autre fichier similaire, selon qu'il s'agisse de TCP / UDP et de IPv4 ou IPv6. etc.



2
votes

La commande lsof est préparé spécifiquement de telle sorte qu'il puisse être utilisé à partir d'autres programmes, notamment C, voir la section: Sortie pour d'autres programmes de homme lsof < / code> pour plus d'informations. Par exemple, vous pouvez appeler lsof avec -f p et il sortira la pid des processus préfixés avec 'P' : xxx

Vous pouvez ensuite utiliser popen pour exécuter cette commune dans un processus enfant et lire à partir de sa sortie standard.


0 commentaires

0
votes

in c (ou c ++) Vous pouvez utiliser l'interface NetLink_sock_diag . Ceci est une prise qui vous donne accès à toutes ces informations. Vous pouvez filtrer sur différents paramètres tels que l'interface que la prise est attachée à.

La documentation est des pièces de rechange, mais j'ai écrit un test de faible niveau pour voir si je pouvais obtenir des événements chaque fois que quelqu'un a ouvert une nouvelle prise, mais cela n'a pas fonctionné. Cela étant dit, pour répertorier les sockets existants, vous pouvez utiliser le code suivant comme bon point de départ:

peut L'interface NetLink / Sock_diag_diag doit être utilisée pour écouter `Écouter ()` et `Fermer ()` Événements de ladite prise?

Je pense que cela est plus propre que d'analyser le / proc / net / tcp et d'autres fichiers similaires. Vous obtenez la même information, mais cela vient à vous en binaire.

Il peut également être plus simple d'utiliser la bibliothèque libnml une couche sur la prise. Il fait de nombreuses vérifications supplémentaires sur tous les appels. Cependant, comme la base NetLink interface, il n'est pas très bien documenté (c'est-à-dire si une liaison est importante, des indicateurs que vous pouvez utiliser avec TCP ou UDP, etc.) La bonne chose est la suivante: vous pouvez toujours lire le source pour mieux comprendre ce qui se passe.


0 commentaires