【问题标题】:Nested select in monitoring devices监控设备中的嵌套选择
【发布时间】:2012-10-28 21:36:01
【问题描述】:

我正在监控新插入的设备。我正在使用 libudev.h 来做我想做的事。

while(1){

        ret = select(fd+1, &fds, NULL, NULL, NULL);

        if(ret<0){

            perror("select() failed. Exitting...");
            exit(EXIT_FAILURE);
        }

        if (FD_ISSET(fd, &fds)) {

            dev = udev_monitor_receive_device(mon);

            if (dev) {
                printf("New device attached\n");
                printf("   Node: %s\n", udev_device_get_devnode(dev));
                printf("   Action: %s\n", udev_device_get_action(dev));

                udev_device_unref(dev);

                   if(strcmp("/dev/ttyUSB0", udev_device_get_devnode(dev))==0){

                     fd1 = open("/dev/ttyUSB0");
                           if (fd<0) exit(0);
                     FD_SET(fd1, &fds);

                     select(fd1+1, &fds, NULL, NULL, NULL);
                      if (FD_ISSET(fd1))         
 //Read from the serial device and echo back to serial device when data is received

 }

                   }

            }

            else {

                printf("No Device from receive_device(). An error occured.\n");

            }                   
        }

现在,例如一个设备被插入并且节点是 /dev/ttyUSB0 我需要打开它并监视它的文件描述符。坐下来等待数据可用。

    fd1 = open("/dev/ttyUSB0");
                               if (fd<0) exit(0);
                         FD_SET(fd1, &fds);

                         select(fd1+1, &fds, NULL, NULL, NULL);
                          if (FD_ISSET(fd1)){

//Read from the serial device and echo back to serial device when data is received
}

在监控 /dev/ttyUSB0 的 fd 时,第一个选择必须继续对设备进行监控。我应该如何同时进行 2 个选择?.. 谢谢

【问题讨论】:

  • 我可能是错的,但我认为典型的 linuxy 要做的事情是分叉一个孩子,让他们担心特定的设备,而父母继续监听更多的设备。许多 linux 守护进程以这种方式运行。
  • 是和不是。一些守护进程这样做,因为它允许用户重新启动主守护进程(例如,当切换到新版本时)而不中断现有连接;但是,这需要额外的逻辑,以便新的主进程识别现有的子进程。

标签: c linux


【解决方案1】:

我认为你应该使用一种锁定机制。

在一个进程中持续探测正在持续探测设备的设备。

然后当它刚刚收到信号给其他进程并修改锁变量时

【讨论】:

    【解决方案2】:

    你不需要同时做两个selects。 select 的全部意义在于您可以同时等待多个文件描述符上的事件。您将这两个文件描述符添加到您的FD_SET,调用select,然后检查使用FD_ISSET 设置的文件描述符。

    【讨论】:

    • 是的,但首先要监控设备。因此,当尚未检测到设备“/dev/ttyUSB0”时,我无法打开它。我打开它并在检测到它时使用它的 fd。然后我将它添加到 fd 集..
    • 每次调用select之前,您都需要将所有fds添加到FD集合中——返回时,只有那些有活动的fds保留在集合中。
    • 是的,但是我如何在 select 语句之后执行 FD_SET。我知道我首先需要在选择之前填写 fd 集。但这需要完成,因为当找到一个设备时,我将打开它并将其添加到 fd_set 但 select 已经执行。这行得通吗?...谢谢
    • 当您打开设备时,您会返回select,同时传递两个文件描述符。当select返回时,任一FD都可能在返回集中;这就是FD_ISSET 测试的内容。所以你会先调用FD_SET,然后是select,然后是所有if(FD_ISSET(...))。如需更多文件描述符,请从那里扩展。
    • select 的第一个参数是所有文件描述符中最大的,加一个。
    猜你喜欢
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多