Что означают объявления {sa_family=AF_UNIX} и [110-> 2] в accept4?

#c #linux-kernel

#c #linux-ядро

Вопрос:

Я выполнил строку в своем Android и получил следующую строку

accept4(8<UNIX:[246]>, {sa_family=AF_UNIX}, [110->2], 0) = 9<UNIX:[2512219]>

Я не понимаю, что делает {sa_family=AF_UNIX} (это должен быть указатель sockaddr, но на что он указывает с точки зрения пути и адреса памяти?), И я хочу знать, что означают 110 и 2 и почему 110 указывает на 2 и что именно возвращается из этой операции.

(Мне действительно интересно, какой узел сокета создан таким образом, потому что я не могу найти индекс 2512219 ни в одном из файлов proc / PID / fd, поэтому мне интересно, мертв ли процесс, который прочитал / записал сокет, и могу ли я получить его имя.) Спасибо!

Комментарии:

1. Как это связано с языком программирования C? Может быть, это препроцессор, фреймворк, что-то еще, но это определенно не похоже на C. Я думаю, вам следует выбрать более подходящий тег.

2. извините, но предполагается, что {sa_family=AF_UNIX} является указателем на структуру, которая, как мне кажется, запрограммирована на C, можете ли вы сказать мне, на каком языке реализована структура sockaddr?

3. Это означает, что параметр представляет собой структуру с полем, имя sa_family которого установлено AF_UNIX равным . man strace говорит, что структуры аннотируются с помощью фигурных скобок , поэтому вы можете захотеть ознакомиться с ним.

4. -f -p -y -yy даст strace: Invalid process id: '-y' , из strace -h : -p pid trace process with process id PID

5. Это означает «было 110, стало 2». Что также объясняет, почему нет пути. Когда адрес безымянного сокета возвращается с помощью getsockname(2), getpeername(2) и accept(2), его длина равна sizeof(sa_family_t), и sun_path не должен проверяться (man unix 7).

Ответ №1:

От man accept4:

int accept4(int sockfd, struct sockaddr *addr, socklen_t *addrlen, флаги int);

 accept4(8<UNIX:[246]>, {sa_family=AF_UNIX}, [110->2], 0) = 9<UNIX:[2512219]>
  
  • 8 является sockfd значением. От man: the listening socket, sockfd
  • 246 является ли номер индекса 8 дескриптора файла
  • Элемент struct .sa_family в структуре struct sockaddr , хранящейся в памяти, на которую указывает указатель addr , имеет значение AF_UNIX
  • От man: [addr] It is filled in with the address of the peer socket, as known to the communications layer .
  • 110 входное значение addrlen ( socklen_t целое число, хранящееся в памяти, на которое указывает addrlen указатель). От man: the caller must initialize it [addrlen] to contain the size (in bytes) of the structure pointed to by addr;
  • 2 значение addrlen после возвращаемой функции. От man: will contain the actual size of the peer address .
  • 0 флаги flags . От man: If flags is 0, then accept4() is the same as accept().
  • 9 возвращенный дескриптор файла. От man: a nonnegative integer that is a file descriptor for the accepted socket
  • 2512219 номер индекса 9 дескриптора файла th