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
.