【问题标题】:not able to read iio file from userspace无法从用户空间读取 iio 文件
【发布时间】:2018-05-22 15:59:22
【问题描述】:

我正在尝试从 C 代码中读取以下文件。

文件:/sys/bus/iio/devices/iio\:device0/in_voltage7_raw

但我得到的文件指针是-1。

使用 cat 命令可以读取文件。

但我试图从我的代码中读取相同的内容,如下所示:

nos_int32 nos_adc_read_port (ADC_PORT_DB *p_port, nos_int32 *data)
{

    char file_name[VALUE_MAX];
    int value;
    char buffer[BUFFER_LENGTH];
    char intBuffer[INT_BUFFER_LENGTH];
    int fd;

    sprintf(file_name, "/sys/bus/iio/devices/iio\\:device0/in_voltage7_raw");

    fd = open(file_name, O_RDONLY);

    if (fd == -1) {
        return(-1);
    }
    if (read(fd, buffer, BUFFER_LENGTH) == -1) {
        return(-1);
    }
    close(fd);
    memcpy(intBuffer, buffer, BUFFER_LENGTH);
    intBuffer[INT_BUFFER_LENGTH-1] = '\0';
    value = atoi(intBuffer);
    *data = value;
    return(0);
}

行后: fd = open(file_name, O_RDONLY);

fd 的值为 -1。怎么解决?

【问题讨论】:

  • 尝试使用sudo 运行您的用户空间代码。
  • 该反斜杠真的在文件名中还是从您的外壳转义冒号?
  • 它可以使用相同的代码读取/sys/class/gpio/gpio70。
  • 有一个转义的反斜杠
  • 您可以使用if (fd == -1)中的perror()函数检查发生了什么错误

标签: c iio


【解决方案1】:

大多数命令行 shell 使用一些字符来执行特殊操作,如果您尝试将它们用作它们的实际字符,则需要在它们前面加上反斜杠以将它们转义。在这种情况下,您的 shell 需要您在访问该文件名时转义冒号。

在 C 中你没有这个问题,所以你可以在你的代码中输入真实的文件名,例如:

"/sys/bus/iio/devices/iio:device0/in_voltage7_raw"

【讨论】:

  • 包含反斜杠以转义文件名中的反斜杠。实际文件名是:/sys/bus/iio/devices/iio\:device0/in_voltage7_raw
  • 不,实际文件名是/sys/bus/iio/devices/iio:device0/in_voltage7_raw,正如this answer中所指出的那样;文件名中没有反斜杠,因此您不必转义 C 字符串中的任何内容。
猜你喜欢
  • 1970-01-01
  • 2018-02-10
  • 1970-01-01
  • 1970-01-01
  • 2016-12-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
相关资源
最近更新 更多