接收uevents - 是在调用uevent_open_socket()之后缓冲的事件?

时间:2015-03-09 21:35:40

标签: android linux udev

此问题基于测试的源代码,该测试演示了接收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;
}

我进行了两次实验:

  1. 首先,我只需在插拔设备时运行此程序。我按预期观察到连接和断开正在打印的uevent消息。
  2. 我在sleep(30)之后添加了uevent_open_socket()。我运行了该程序,并在30秒的睡眠期间再次插入并拔下了设备。我的预期行为是看到uevent消息在64*1024字节缓冲区中缓冲,后来读取&amp;在完成30秒睡眠后打印出来。

    然而,实际行为是在30秒睡眠后没有收到任何消息。

  3. 这给我提出了几个问题:

    1. 消息是否完全缓冲?
    2. 如果是,缓冲策略的性质是什么,导致邮件完全丢弃而未收到?
    3. 如果不是,那么在一个假设的情况下,不会丢弃消息,在这种情况下,消息的生成频率高于它们可以接收到的频率。处理?

0 个答案:

没有答案