【问题标题】:Test for device using udev sysname使用 udev sysname 测试设备
【发布时间】:2015-09-07 19:04:00
【问题描述】:

我正在 Ubuntu 中编写我的第一个 C 程序,它涉及检测我笔记本电脑上的交流适配器或电池何时看到事件(通过udev_monitor)。到目前为止,当电源情况发生变化时,我可以使用类似while sn-p:

while (1) {
    dev = udev_monitor_receive_device(mon);
    if (dev) {
        printf("\n[INFO] Got Device\n");
        printf(" [INFO] Device Name: %s\n", udev_device_get_sysname(dev));
...

那太好了!当我插入或拔出笔记本电脑时,我会将其记录到控制台。但是,我没能理解的是如何使用这些相同的功能进行有条件的测试。

例如,这绝不是真的:

if (udev_device_get_sysname(dev) == "ADP1") { ... }

我不确定如何正确测试它。显然,当使用printf()%s 时,它会打印为字符串(字符数组?)。

编辑:从调用的函数记录到控制台的值是适配器的 ADP1 和电池的 BAT0 - 这与它们在 /sys/class/ 目录中的条目相关。

【问题讨论】:

  • 使用strcmp comape c 中的字符串
  • C字符串比较中使用strcmp/strncmp,否则你是在比较指针值,这不会是一样的
  • 真的那么简单吗?我真的不习惯字符串在 C 中的工作方式。我会试一试 - 谢谢!
  • 顺便说一句,udev_monitor_receive_device 会阻塞你的线程吗?我相信,不是,所以你正在 忙等待 浪费你的 CPU 周期和功率
  • @user996142 是的,有一个非阻塞的解决方案,但我想在实施另一个优化之前完全了解我的程序。

标签: c udev


【解决方案1】:

在 C 中,您使用字符串比较例程之一来比较字符串,例如 strcmpstrncmp。如果您使用== 比较它们,您只是在比较指针的值,这将是不一样的。

所以对于检查系统名的代码来说,系统名是不正确的,因为指针比较永远不会是真的。应该改成这样的:

if (strcmp(udev_device_get_sysname(dev), "ADP1") == 0) { … }

这会导致它比较字符串,而不是指针值。

【讨论】:

  • 谢谢!指针对我来说是一个全新的世界;答案看似简单。我的自定义屏幕调光应用现在运行良好!
猜你喜欢
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
  • 2013-12-22
  • 2011-02-19
  • 1970-01-01
  • 2014-02-15
相关资源
最近更新 更多