此问题基于测试的源代码,该测试演示了接收uevents,here。相关代码是:
int main(int argc, char *argv[])
{
int device_fd;
char msg[UEVENT_MSG_LEN+2];
int n;
int i;
device_fd = uevent_open_socket(64*1024, true);
if(device_fd < 0)
return -1;
while ((n = uevent_kernel_multicast_recv(device_fd, msg, UEVENT_MSG_LEN)) > 0) {
msg[n] = '\0';
msg[n+1] = '\0';
for (i = 0; i < n; i++)
if (msg[i] == '\0')
msg[i] = ' ';
printf("%s\n", msg);
}
return 0;
}
我进行了两次实验:
我在sleep(30)
之后添加了uevent_open_socket()
。我运行了该程序,并在30秒的睡眠期间再次插入并拔下了设备。我的预期行为是看到uevent消息在64*1024
字节缓冲区中缓冲,后来读取&amp;在完成30秒睡眠后打印出来。
然而,实际行为是在30秒睡眠后没有收到任何消息。
这给我提出了几个问题: