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

How can I access a linux character device with D?

我想用 D 语言编写的脚本打开和关闭嵌入式 linux 开发板 (BeagleBone Black) 的 LED(字符设备)。

通过命令行可以打开和关闭 LED(例如 LED "USER LEDS D2 0"):

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

(echo none > trigger 禁用默认 "heartbeat" 闪烁)

在第 93 页的 D Cookbook 中,我找到了有关如何通过 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);
}

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

unistd 调用确实是正确的方法。 Linux 中的字符设备是一种特殊类型的文件,访问方式相同:您通过路径 open 它,然后 readwrite 到它,然后 close 完成后。

注意open实际上在core.sys.posix.fcntl里面,而readcore.sys.posix.unistd里面。

您也可以使用 D 标准库中的 std.file.write() 来缩短一些。那里还有 chdir。所以你的 shell 例子会变成:

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 作为导入的全名,我只是喜欢,因为 write 是一个很常见的词,它清楚了我们的意思。

无论如何,此函数只是为您完成了 unistd 调用:它打开、写入字符串并关闭所有内容(就像 shell echo!)。

一个小区别是 shell echo 在字符串的末尾添加了一个 \n。我没有在这里这样做。如果代码不起作用,请尝试“1\n”等,也许设备需要这样。但我对此表示怀疑。

但是 std.file.writecore.sys.posix.unistd.write 没有太大区别。前者更方便,后者控制更精准