代码之家  ›  专栏  ›  技术社区  ›  thinwybk

如何使用D访问linux字符设备?

  •  3
  • thinwybk  · 技术社区  · 7 年前

    我想用D写的脚本打开和关闭嵌入式linux板(BeagleBone黑色)的led(字符设备)。

    通过命令行,可以通过以下方式打开和关闭led(例如,对于led“用户led D20”):

    cd /sys/class/leds/beaglebone:green:usr0
    echo none > trigger
    echo 1 > brightness
    echo 0 > brightness
    

    ( echo none > trigger

    D Cookbook 在第93页,我找到了关于如何通过C接口进行linux系统调用的信息,如下所示:

    void main(){
       import core.sys.posix.unistd;  // analogous to #include <unistd.h>
       string hello = "Hello, world!";
       write(1 /*stdout file descriptor*/, hello.ptr, hello.length);
    }
    

    这是访问字符设备的合适方法还是有更好的替代方法?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Adam D. Ruppe    7 年前

    这个 unistd open 然后,通过路径 read write 它,和 close

    请注意 打开 core.sys.posix.fcntl 阅读 在中 core.sys.posix.unistd .

    你也可以使用 std.file.write() 从D标准库缩短一点。还有 chdir

    import std.file;
    chdir("/sys/class/leds/beaglebone:green:usr0");
    std.file.write("trigger", "none"); // write "filename", "data string"
    std.file.write("brightness", "1");
    std.file.write("brightness", "0");
    

    std.file.write 作为全名的导入,我只是喜欢自

    无论如何,这个函数只是为您包装了unistd调用:它将打开、写入字符串和关闭全部功能于一身(就像shell echo一样!)。

    一个小区别是shell echo 粘贴a \n 在字符串的末尾。我不是在这里做的。如果代码不起作用,请尝试“1”之类的选项,可能设备需要这样的选项。但我对此表示怀疑。

    std.file.write core.sys.posix.unistd.write 没有太大的不同。前者更方便,后者对其进行更精确的控制。