在C中写入Linux sysfs节点

问题描述 投票:0回答:4

从 shell 中,我可以像这样激活系统上的 LED:

#echo 1 > /sys/class/leds/NAME:COLOR:LOCATION/brightness

我想从 C 程序中执行完全相同的操作,但我无法找到如何完成此操作的简单示例?

c linux
4个回答
10
投票

像打开文件一样打开sysfs节点,向其写入“1”,然后再次关闭。

例如:

#include <stdio.h>
#include <fcntl.h>

void enable_led() {
  int fd;
  char d = '1';
  fd = open("sys/class/leds/NAME:COLOR:LOCATION/brightness", O_WRONLY);
  write (fd, &d, 1);
  close(fd);
}

3
投票

类似这样的:

#include <stdio.h>

int main(int argc, char **argv)
{
    FILE* f = fopen("/sys/class/leds/NAME:COLOR:LOCATION/brightness", "w");
    if (f == NULL) {
        fprintf(stderr, "Unable to open path for writing\n");
        return 1;
    }

    fprintf(f, "1\n");
    fclose(f);
    return 0;
}

2
投票

我没有启动到我的 Linux 分区,但我怀疑它是这样的:

int f = open("/sys/class/leds/NAME:COLOR:LOCATION/brightness",O_WRONLY);
if (f != -1)
{
    write(f, "1", 1);
    close(f);
}

0
投票

我尝试使用 Beaglebone Black。采用两种方式(fcntl 与 stdio),但 fcntl 是在 GPIO 上切换任何内容的唯一方法。

工作代码

int main (void) {
    int f = 0;

    // Set direction out
    f = open("/sys/class/gpio/gpio60/direction", O_RDWR);
    write(f, "out", 3); 
    close(f);

    // Writing on/off to LED
    f = open("/sys/class/gpio/gpio60/value", O_WRONLY);
    while (1) {
        // LED ON
        printf("LED ON\n");
        write(f, "1", 1); 
        // Sleep for 1 sec
        sleep(1);
        // LED OFF
        printf("LED OFF\n");
        write(f, "0", 1); 
        // Again, sleep for 1 sec
        sleep(1);
    }   
    close(f);

    return 0;
}

无法运行代码

int main (void) {
    FILE* f = 0;

    // Set direction out
    f = fopen("/sys/class/gpio/gpio60/direction", "w");
    fprintf(f, "out\n");
    fclose(f);

    // Writing on/off to LED
    f = fopen("/sys/class/gpio/gpio60/value", "w");
    while (1) {
        // LED ON
        printf("LED ON\n");
        fprintf(f, "1\n");
        // Sleep for 1 sec
        sleep(1);
        // LED OFF
        printf("LED OFF\n");
        fprintf(f, "0\n", 1); 
        // Again, sleep for 1 sec
        sleep(1);
    }   
    fclose(f);

    return 0;
}

我不知道,如果我尝试使用 sysfs 文件进行“文件”操作,它们会变成 ASCII 文本..但典型的文本操作方法(fprintf、fopen 等)似乎不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.