GNU/Linux >> Znalost Linux >  >> Linux

Kdo má druhý konec tohoto páru soketů Unix?

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 .


Linux
  1. ^M na konci každého řádku ve vim

  2. erlang:Podpora soketu domény UNIX?

  3. Jak správně použít volbu SO_KEEPALIVE, abyste zjistili, že klient na druhém konci je mimo provoz?

  1. Jak převést řetězec na celé číslo v UNIXu

  2. Jak fungují volby '-s', '-t' a '-c' příkazu tr v Unixu?

  3. Zjistěte, jaký proces je na druhém konci potrubí

  1. Linux vs. Unix:Jaký je rozdíl?

  2. Jaký je rozsah exportovaných proměnných shellu Unix?

  3. Co označuje symbol @ na začátku cesty soketu domény unix v Linuxu?