Mono 无法访问文件,即使 linux shell 可以在没有 root 的情况下访问
Mono cannot access file even though linux shell can without root
这可能不是问这个问题的地方(但我认为它是正确的地方,因为它涉及编程)。
所以我的学校项目得了 raspberry pi 零分。我 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 写入其中,然后 'unexport's 它,不需要 root。
我也想尝试这张卡片中的一些语言。我尝试了 python、C# 和 Rust 没有问题(尽管 Rust 编译速度很慢,但它可以工作)。所以我开始使用我最喜欢的语言 C# 和 mono。安装它并编译一个基本程序没什么大不了的,它有效。
所以我这样写:
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脚开路,'unexport'然后重新导出,设置为输出,写入数字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
是一个符号 link,我也尝试访问原始路径,但没有成功。
这可能是什么问题?
猜测:
- 你先取消导出它,然后导出它并立即访问它,我过去在某些 OS e 上遇到过几次问题。 G。删除文件并立即重新创建它,添加等待时间(不是真正干净的代码,但如果它有效)
- 检查 files/folders 与 linux 命令的区别 "ls -la" 或更多
- 通过 e 从 C# 调用有效的 shell 命令。 G。进程 class
- 有几次 Mono 在 Windows 上不像 C# 那样工作,必须找到解决方法
- 尝试打开这些文件的流并让它们保持打开状态?或者甚至可以通过管道传输这些文件?
这可能不是问这个问题的地方(但我认为它是正确的地方,因为它涉及编程)。
所以我的学校项目得了 raspberry pi 零分。我 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 写入其中,然后 'unexport's 它,不需要 root。
我也想尝试这张卡片中的一些语言。我尝试了 python、C# 和 Rust 没有问题(尽管 Rust 编译速度很慢,但它可以工作)。所以我开始使用我最喜欢的语言 C# 和 mono。安装它并编译一个基本程序没什么大不了的,它有效。
所以我这样写:
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脚开路,'unexport'然后重新导出,设置为输出,写入数字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
是一个符号 link,我也尝试访问原始路径,但没有成功。
这可能是什么问题?
猜测:
- 你先取消导出它,然后导出它并立即访问它,我过去在某些 OS e 上遇到过几次问题。 G。删除文件并立即重新创建它,添加等待时间(不是真正干净的代码,但如果它有效)
- 检查 files/folders 与 linux 命令的区别 "ls -la" 或更多
- 通过 e 从 C# 调用有效的 shell 命令。 G。进程 class
- 有几次 Mono 在 Windows 上不像 C# 那样工作,必须找到解决方法
- 尝试打开这些文件的流并让它们保持打开状态?或者甚至可以通过管道传输这些文件?