如何使用 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
它,然后 read
或 write
到它,然后 close
完成后。
注意open
实际上在core.sys.posix.fcntl
里面,而read
在core.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.write
与 core.sys.posix.unistd.write
没有太大区别。前者更方便,后者控制更精准
我想用 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
它,然后 read
或 write
到它,然后 close
完成后。
注意open
实际上在core.sys.posix.fcntl
里面,而read
在core.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.write
与 core.sys.posix.unistd.write
没有太大区别。前者更方便,后者控制更精准