首页 > 解决方案 > 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.exemono ./program.exe
适用当然,我总是可以使用wiringPi或python,但我对这个很好奇,找不到答案。这对我来说没有意义。/sys/class/gpio/gpio17是一个符号链接,我也尝试访问原始路径但没有运气。

这里可能有什么问题?

标签: c#linuxraspberry-pigpioraspberry-pi-zero

解决方案


猜测:

  • 您首先取消导出,然后导出并立即访问它,过去我在某些操作系统上遇到过几次问题,例如删除文件并立即再次创建它,添加等待时间(不是真正干净的代码,但如果它有效)
  • 使用linux命令“ls -la”或更多检查文件/文件夹的差异
  • 通过例如 Process 类从 C# 调用有效的 shell 命令
  • 有几次 Mono 在 Windows 上不像 C# 那样工作,必须找到一种解决方法
  • 尝试打开这些文件的流并使它们保持打开状态?或者这些文件甚至可以使用管道?

推荐阅读