LINUX.ORG.RU

Узнать pid процесса по номеру занимаемого им порта.

 ,


1

2

Есть задача. Дан номер порта нужно узнать pid процесса который его слушает, или узнать об отсутствие такого процесса. Заранее спасибо.

★★★★★

Последнее исправление: Dudraug (всего исправлений: 1)

Ответ на: комментарий от red_eyed_peguin

Спасибо. Надо будет серьезно заняться изучением /proc. Жалко, что многие вещи вместо сисколов доступны только через /proc

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

ну да, не lstat, a stat. чтобы отсечь несокеты.

В fd одни только симлинки. Стат там может понадобиться разве что чтобы «..» и «.» отличить от файлов, но это всегда проще делать по имени.

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

В fd одни только симлинки. Стат там может понадобиться разве что чтобы «..» и «.» отличить от файлов, но это всегда проще делать по имени.

stat идет по симлинкам. и чтобы лишний раз не парсить всякие /dev/null или /dev/sdtin, проще отсекать по S_IFSOCK. а потом уже readlink(), sscanf имени и смотреть в предварительно созданном хэше порт по иноду

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

stat идет по симлинкам. и чтобы лишний раз не парсить всякие /dev/null или /dev/sdtin, проще отсекать по S_IFSOCK.

Проще тебе сходить в /proc/$(pgrep -n firefox)/fd и посмотреть, что из себя представляет дескриптор сокета в /proc, чтоб потом таких вот вредных советов не давать.

red_eyed_peguin
()
Ответ на: комментарий от Dudraug

Жалко, что многие вещи вместо сисколов доступны только через /proc

если на каждый пердок создавать сискол - и ядро ил libc разбухнут до омерзения. а текст - универсальный интерфейс. пиши свой парсер, оформляй в библиотеку и пользуйся. походу для работы с процессами есть libprocps. но документирована она отвратно.

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

А ты все-таки сходи, куда я посоветовал, чтобы воочию убедиться, что сокетный дескриптор не указывает вообще ни на какой реально существующий файл.

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

из принципа

(victor@ksakep)~ $> cat t.c                                                                               [sh]
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>

int
main (int argc, char *argv[])
{
  struct stat st;

  if (argc < 2)
    return 1;

  if (stat (argv[1], &st) == -1) 
    return 1;

  if ((st.st_mode & S_IFMT) == S_IFSOCK)
    printf ("socket\n");
  else
    printf ("not socket\n");

  return 0;
}
(victor@ksakep)~ $> gcc -o ft t.c                                                                         [sh]
(victor@ksakep)~ $> sudo ft /proc/313/fd/1                                                                [sh]
not socket
(victor@ksakep)~ $> sudo ft /proc/313/fd/3                                                                [sh]
socket
(victor@ksakep)~ $>                                                                                       [sh]

313 - это sshd

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

если на каждый пердок создавать сискол - и ядро ил libc разбухнут до омерзения

Почему же на каждый пердок? Я бы даже согласился сделать сабж через набор сисколов, возможно даже приличный. Но парсить файлы...вместо API...

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

Ну во-первых как-то неудобно. А во-вторых - как быть с синхронизацией? Файл /proc/net/tcp равзе не может изменится пока мы его читаем?

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

Файл /proc/net/tcp равзе не может изменится пока мы его читаем?

может. но для твоей задачи это без разницы

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