#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