为了完成内核空间与用户空间通信,Linux提供了基于Socket的NetLink通信机制。
SELinux,Linux系统的防火墙分为内核态的netfilter和用户态的iptables,netfilter与iptables的数据交换就是通过Netlink机制完成。
下面看一个检测usb口的例子:
s32 InitUsbHotPlug(void)
{
s32 nSockFd = 0;
// 套接字地址
struct sockaddr_nl snl;
bzero(&snl, sizeof(struct sockaddr_nl));
// 1.添写套接字地址
snl.nl_family = AF_NETLINK;
snl.nl_pad = 0;
// 设置为处理消息的进程ID。
snl.nl_pid = getpid();
snl.nl_groups = 1;
// 2.创建套接字, 返回套接字文件描述符
// PF_NETLINK - 使用 netlink
// SOCK_DGRAM - 使用不连续不可信赖的数据包连接
// NETLINK_KOBJECT_UEVENT - 内核消息到用户空间,出现在 Linux 2.6.10
nSockFd = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
if (-1 == nSockFd)
{
return -1;
}
// 3.设置套接字接收缓冲区大小
// SOL_SOCKET - 存取 socket 层
// SO_RCVBUF - 设置接收缓冲区大小
// 接收内核发来的消息缓冲区大小
const s32 nRcvBufSize = 1024;
setsockopt(