GNU/Linux >> Tutoriels Linux >  >> Linux

Qui a l'autre bout de cette paire de sockets Unix ?

Je veux déterminer quel processus a l'autre extrémité d'un socket UNIX.

Plus précisément, je pose une question sur celle qui a été créée avec socketpair() , bien que le problème soit le même pour n'importe quel socket UNIX.

J'ai un programme parent qui crée un socketpair(AF_UNIX, SOCK_STREAM, 0, fds) , et fork() s. Le processus parent ferme fds[1] et conserve fds[0] communiquer. L'enfant fait le contraire, close(fds[0]); s=fds[1] . Puis l'enfant exec() est un autre programme, child1 . Les deux peuvent communiquer via cette paire de sockets.

Maintenant, disons que je sais qui parent est, mais je veux savoir qui est child1 est. Comment faire ?

Il existe plusieurs outils à ma disposition, mais aucun ne peut me dire quel processus se trouve à l'autre bout du socket. J'ai essayé :

  • lsof -c progname
  • lsof -c parent -c child1
  • ls -l /proc/$(pidof server)/fd
  • cat /proc/net/unix

Fondamentalement, je peux voir les deux prises et tout ce qui les concerne, mais je ne peux pas dire qu'elles sont connectées. J'essaie de déterminer quel FD du parent communique avec quel processus enfant.

Réponse acceptée :

Depuis le noyau 3.3, il est possible d'utiliser ss ou lsof-4.89 ou au-dessus — voir la réponse de Stéphane Chazelas.

Dans les anciennes versions, selon l'auteur de lsof , il était impossible de le savoir :le noyau Linux n'expose pas cette information. Source :fil de discussion de 2003 sur comp.unix.admin.

Le nombre affiché dans /proc/$pid/fd/$fd est le numéro d'inode du socket dans le système de fichiers du socket virtuel. Lorsque vous créez une paire de tubes ou de sockets, chaque extrémité reçoit successivement un numéro d'inode. Les numéros sont attribués séquentiellement, il y a donc une forte probabilité que les numéros diffèrent de 1, mais cela n'est pas garanti (soit parce que la première prise était N et N +1 était déjà utilisé en raison d'un encapsulage ou parce qu'un autre thread était planifié entre les deux allocations d'inodes et que ce thread a également créé des inodes).

J'ai vérifié la définition de socketpair dans le noyau 2.6.39, et les deux extrémités du socket ne sont pas corrélées sauf par le socketpair spécifique au type méthode. Pour les sockets Unix, c'est unix_socketpair dans net/unix/af_unix.c .


Linux
  1. Les theths sur les logiciels malveillants sous Unix / Linux ?

  2. ^M à la fin de chaque ligne dans vim

  3. Comment trouver la taille du tampon de socket de Linux

  4. Trouver quel processus se trouve à l'autre bout d'un tuyau

  5. Quelle est la portée des variables shell exportées dans Unix ?

Linux vs Unix :Quelle est la différence ?

La philosophie Linux est-elle toujours d'actualité en 2019 ?

Quelle est la différence entre Linux et Unix ?

Comment convertir une chaîne en entier sous UNIX

Comment fonctionnent les options '-s', '-t' et '-c' de la commande tr sous Unix ?

Renifler le socket de domaine UNIX