Chci zjistit, který proces má druhý konec soketu UNIX.
Konkrétně se ptám na jeden, který byl vytvořen pomocí socketpair()
, ačkoli problém je stejný pro jakýkoli soket UNIX.
Mám program parent
který vytvoří socketpair(AF_UNIX, SOCK_STREAM, 0, fds)
a fork()
s. Nadřazený proces zavře fds[1]
a zachovává fds[0]
komunikovat. Dítě udělá opak, close(fds[0]); s=fds[1]
. Potom potomek exec()
je jiný program, child1
. Tyto dva mohou komunikovat tam a zpět přes tento pár zásuvek.
Nyní řekněme, že vím, kdo je parent
je, ale chci zjistit, kdo child1
je. Jak to udělám?
Mám k dispozici několik nástrojů, ale žádný mi nedokáže říct, který proces je na druhém konci zásuvky. Zkoušel jsem:
lsof -c progname
lsof -c parent -c child1
ls -l /proc/$(pidof server)/fd
cat /proc/net/unix
V podstatě vidím dvě zásuvky a vše o nich, ale nemohu říct, že jsou propojené. Snažím se určit, který FD v nadřazeném procesu komunikuje s kterým podřízeným procesem.
Přijatá odpověď:
Od jádra 3.3 je možné použít ss
nebo lsof-4.89
nebo výše – viz odpověď Stéphana Chazelase.
Ve starších verzích podle autora lsof
, nebylo možné to zjistit:linuxové jádro tyto informace nezveřejňuje. Zdroj:2003 vlákno na comp.unix.admin.
Číslo zobrazené v /proc/$pid/fd/$fd
je číslo inodu soketu v souborovém systému virtuálního soketu. Když vytvoříte pár potrubí nebo zásuvek, každý konec postupně obdrží číslo inodu. Čísla jsou připisována postupně, takže je vysoká pravděpodobnost, že se čísla budou lišit o 1, ale to není zaručeno (buď proto, že první soket byl N a N +1 se již používalo kvůli zalamování nebo proto, že mezi dvěma alokacemi inodů bylo naplánováno nějaké jiné vlákno a toto vlákno také vytvořilo nějaké inody).
Zkontroloval jsem definici socketpair
v jádře 2.6.39 a dva konce soketu nejsou korelovány kromě typově specifického socketpair
metoda. Pro unixové sokety je to unix_socketpair
v net/unix/af_unix.c
.