LINUX.ORG.RU

получить pid процесса владеющего сокетом

 , , ,


0

1

В моем приложении мне нужно получить PID процесса владеющего сокетом. Пока что вижу единственный вариант: пройти по всем /proc/PID/fd/*, прочитать readlink() все записи типа socket:[inode], и потом по иноду получить fd сокета.

Но есть ли способ проще? Я не нашел syscall'a который бы это делал, может быть плохо искал, или есть причины по которым его не реализовали? (болошой оверхед и пр.)

Спасибо.

★★

Пока что вижу единственный вариант: пройти по всем /proc/PID/fd/*

AFAIK lsof так и делает. Так что, видимо, другого способа нет.

utf8nowhere ★★★
()
Ответ на: комментарий от utf8nowhere

Хм, сейчас задумался — а что уникально идентифицирует сокет, его fd или inode? Могут ли быть одинаковые fd у разных процессов?

cruz7 ★★
() автор топика
Ответ на: комментарий от cruz7

Один сокет может быть у нескольких pid после clone()/fork().

Именно из-за этого у нас есть отдельно таблицы сокетов по протоколам (/proc/net/{tcp,udp,icmp,raw,packet,...} с указанием inode, а в /proc/<pid>/fd/<N> линки на них.

vel ★★★★★
()
Ответ на: комментарий от vel

Понятно, поскольку после fork() новый процесс унаследует дескрипторы родителя. Получается что единственный надежный способ «вычислить» сокет и работающий с ним pid — это парсить /proc и искать по inode.

cruz7 ★★
() автор топика
Ответ на: комментарий от vel

Именно из-за этого у нас есть отдельно таблицы сокетов по протоколам (/proc/net/{tcp,udp,icmp,raw,packet,...} с указанием inode, а в /proc/<pid>/fd/<N> линки на них.

После clone/fork у сокета в child-процессе сохраняется inode?

cruz7 ★★
() автор топика
Последнее исправление: cruz7 (всего исправлений: 1)
Ответ на: комментарий от vel

Спасибо.

Еще вопрос по таблице процессов — она одна в ядре? Как можно в ядре получить доступ к ней, то есть например пройтись по ней. Есть ли какой-то глобальный «объект», хендл например, через который можно добраться до таблицы?

cruz7 ★★
() автор топика
Ответ на: комментарий от cruz7

в ядре, для каждого netns она своя.

Все просто - смотришь как показывается /proc/net/{tcp,udp,...}

самый простой udp. Посмотри в net/ipv4/udp.c про udp4_seq_show, udp4_seq_afinfo, udp_seq_open, udp_get_next

vel ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.