【发布时间】:2019-11-30 19:21:29
【问题描述】:
我正在尝试使用 BlueZ HCI 功能:
int hci_open_dev(int dev_id) {...}
它在内部尝试像这样创建一个套接字:
socket(AF_BLUETOOTH, SOCK_RAW | SOCK_CLOEXEC, BTPROTO_HCI);
我试图理解 socket() 的 linux 内核代码,但感到迷茫。
我想知道为给定域 (AF_BLUETOOTH)、数据传输类型 (SOCK_RAW) 和协议 (BTPROTO_HCI) 创建套接字到底意味着什么。
手册页只是声明它接受这些参数,创建一个套接字并返回一个设备描述符。
但我想了解究竟发生了什么以及创建套接字所涉及的确切内核步骤。
【问题讨论】:
-
如果你想知道确切的内核步骤,那么你必须阅读内核代码。既然你已经尝试过了,我不知道如何回答这个问题。即使要求对该过程进行概述也太宽泛了,因为它涉及到 1) 文件描述符如何工作,2) 协议栈如何工作,以及 3) 设备驱动程序如何工作的讨论。这些主题可以轻松填满一本书,或者一本书中至少 3 个章节。
-
很公平,但我想在某种抽象层次上理解,socket() 究竟是如何位于进行 socket() 系统调用的用户进程和硬件设备(在这种情况下为蓝牙芯片组)之间的.
-
我认为您已经阅读了
bluetooth/af_bluetooth.c,但由于您没有提及该文件,因此您可能没有。 -
@Cheatah 我在搜索 AF_BLUETOOTH 域定义时查看了该文件。但遗憾的是无法将其中的信息上下文化。
-
我个人不会因为“太宽泛”而投票结束这个问题。回答它需要相当多的努力,但这是一个关于 Linux 上
AF_BLUETOOTH套接字的特定问题,因此我会说它是可以回答的。我不会付出必要的努力来回答它,但我认为这不是关闭它的足够充分的理由。大概几十行就可以总结出内核中发生的事情。
标签: c linux sockets linux-kernel bluez