0
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);
}

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

1)为什么使用 ssize_t?为什么不只使用int?

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

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

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

4

1 回答 1

1
  1. 我不知道为什么代码示例使用ssize_t; 的返回类型snprintf因此int使用 anint会更好(以避免隐式强制转换)。ssize_t已签名,并且在大多数情况下,它至少与 an 一样大,int因此可能不会造成任何伤害。

  2. 是的,它是 Linux 上的系统文件。将 GPIO 引脚的编号写入此文件将“取消导出”通用 GPIO 驱动程序中的 GPIO 引脚,从而有效地使驱动程序声明它将不再处理该引脚(允许其他 GPIO 驱动程序使用它)。

  3. 您可以使用dprintf直接写入文件描述符fd,然后就不需要临时缓冲区。dprintf其他变体不太为人所知,printf所以也许这就是原始代码的作者决定使用中间缓冲区然后只调用标准低级write函数的原因。

  4. 你的意思是什么ioctl功能?

于 2013-10-07T07:28:42.907 回答