Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Linux的GPIO示例代码_C_Linux - Fatal编程技术网

C Linux的GPIO示例代码

C Linux的GPIO示例代码,c,linux,C,Linux,我有几个问题与上述GPIO代码有关 1) 为什么要使用ssize\t?为什么不用int呢 2) /sys/class/gpio/unexport是“系统文件”吗?如果不是,它是什么 3) snprintf将一些东西打印到缓冲区,那么写函数是多余的吗?或者写函数可以做什么不同的事情 4) 我可以用ioctl函数代替open吗 我不知道为什么代码示例使用ssize_t;snprintf的返回类型是int,因此使用int会更好(以避免隐式强制转换)。ssize_t是有符号的,在大多数情况下,它至少与i

我有几个问题与上述GPIO代码有关

1) 为什么要使用ssize\t?为什么不用int呢

2) /sys/class/gpio/unexport是“系统文件”吗?如果不是,它是什么

3) snprintf将一些东西打印到缓冲区,那么写函数是多余的吗?或者写函数可以做什么不同的事情

4) 我可以用ioctl函数代替open吗

  • 我不知道为什么代码示例使用
    ssize_t
    ;snprintf的返回类型是
    int
    ,因此使用
    int
    会更好(以避免隐式强制转换)。
    ssize_t
    是有符号的,在大多数情况下,它至少与
    int
    一样大,因此可能不会造成伤害

  • 是的,它是Linux上的一个系统文件。将GPIO pin的编号写入此文件将“取消”通用GPIO驱动程序中的GPIO pin,从而使驱动程序声明不再处理该pin(允许其他GPIO驱动程序使用它)

  • 您可以使用
    dprintf
    直接写入文件描述符
    fd
    ,这样您就不需要临时缓冲区了。
    dprintf
    与其他
    printf
    变体相比,我们知之甚少,所以可能这就是原始代码的作者决定使用中间缓冲区,然后只调用标准的低级
    write
    功能

  • 你指的是什么类型的
    ioctl
    函数

  • static int
    GPIOUnexport(int pin)
    {
        char buffer[BUFFER_MAX];
        ssize_t bytes_written;
        int fd;
    
        fd = open("/sys/class/gpio/unexport", O_WRONLY);
        if (-1 == fd) {
            fprintf(stderr, "Failed to open unexport for writing!\n");
            return(-1);
        }
    
        bytes_written = snprintf(buffer, BUFFER_MAX, "%d", pin);
        write(fd, buffer, bytes_written);
        close(fd);
        return(0);
    }