c# - Mono 无法访问文件,即使 linux shell 可以在没有 root 的情况下访问
问题描述
这可能是一个错误的地方问这个问题(但我认为它是正确的地方,因为它涉及编程)。
所以我为我们的学校项目得到了一个树莓派零。我通过 SSH 进入它以检查它可以用它做什么。我对如何使用这张卡上的 GPIO 引脚进行了一些研究。
基本上:
$ echo 17 > /sys/class/gpio/export
$ echo out > /sys/class/gpio/gpio17/direction
$ echo 1 > /sys/class/gpio/gpio17/value
$ echo 17 > /sys/class/gpio/unexport
启用 GPIO 引脚 17 并将数字 1 写入其中并“取消导出”它,不需要 root。
我还想尝试一下这张卡片中的一些语言。我尝试了 python、C# 和 Rust 没有问题(尽管 rust 编译速度很慢,但它可以工作)。所以我开始使用我最喜欢的语言 C# 和单声道。安装它并编译一个基本程序没什么大不了的,它可以工作。
所以我写这个:
using System;
using System.IO;
namespace Program
{
public static class Program
{
public static void Main()
{
if (Directory.Exists("/sys/class/gpio/gpio17/"))
File.WriteAllText("/sys/class/gpio/unexport", "17");
File.WriteAllText("/sys/class/gpio/export", "17");
File.WriteAllText("/sys/class/gpio/gpio17/direction", "out");
File.WriteAllText("/sys/class/gpio/gpio17/value", "1");
}
}
}
基本上,如果它发现 17 引脚打开,则“取消导出”它然后重新导出它,设置为输出并写入数字 1。
编译:
mcs program.cs -out:program.exe -debug && ./program.exe
输出:
Unhandled Exception:
System.UnauthorizedAccessException: Access to the path "/sys/class/gpio/gpio17/direction" is
denied.
什么?如何?它适用,sudo mono ./program.exe
不mono ./program.exe
适用当然,我总是可以使用wiringPi或python,但我对这个很好奇,找不到答案。这对我来说没有意义。/sys/class/gpio/gpio17
是一个符号链接,我也尝试访问原始路径但没有运气。
这里可能有什么问题?
解决方案
猜测:
- 您首先取消导出,然后导出并立即访问它,过去我在某些操作系统上遇到过几次问题,例如删除文件并立即再次创建它,添加等待时间(不是真正干净的代码,但如果它有效)
- 使用linux命令“ls -la”或更多检查文件/文件夹的差异
- 通过例如 Process 类从 C# 调用有效的 shell 命令
- 有几次 Mono 在 Windows 上不像 C# 那样工作,必须找到一种解决方法
- 尝试打开这些文件的流并使它们保持打开状态?或者这些文件甚至可以使用管道?
推荐阅读
- flutter - 堆叠架构 - 用户持久性
- sockets - python socket.io 如何发射到特定的客户端?
- r - 在使用分段回归之前我必须分析变化点吗?
- python - 如何从python中的api响应中提取特定字符串?
- javascript - Javascript计算日期中的年份差异错误?
- c# - 使用css Grid动态对齐同一行中的项目
- html - 字体样式和字体大小在发送到 Gmail 的 HTML 电子邮件中不起作用
- php - 我想使用 Laravel 6 创建一个私有目录
- odata - 重命名通过引用的 CDS 视图生成的 OData 服务的实体?
- function - 在 trait 实现中关联特定函数