sysfs 파일의 동기 I/O

sysfs 파일의 동기 I/O

나는 sysfs 파일(특히 file )에 쓰는 내용이 /sys/class/gpio실제 레지스터와 동기화되는지 확인하고 싶습니다. 이 플래그를 사용하여 파일을 여는 내 원래 코드 O_SYNC는 이것이라고 생각합니다. 그러나 다른 코드에서는 를 사용하려고 시도했지만 fsync()EINVAL과 함께 실패하고 다음과 같이 man fsync알려줍니다.

   EROFS, EINVAL
          fd is bound to a special file which does not support synchronization

sysfs 파일에서 가능한 작업에 대한 코드를 확인했지만 어떤 유형 do_sync_write이나 do_fsync기능도 찾지 못했습니다.

그렇다면 O_SYNCsysfs 파일을 열 때 이 플래그가 어떤 영향을 미칩니까? open동기 읽기/쓰기를 지원하지 않는 파일을 열려고 하면 오류 코드가 반환되어야 하지 않나요 O_SYNC?

인사,

길예르메

답변1

/체계커널 데이터 구조에 액세스하기 위한 완전한 RAM 기반 파일 시스템입니다. 여기에는 다음이 포함됩니다범용 입력 및 출력 인터페이스상호 작용.

당신이 해야 할 일은 더미 파일을 정상적으로 열고 단일 쓰기를 사용하여 데이터를 쓰는 것뿐입니다. 성공하고 모든 데이터(아마도 후행 공백(예: 개행) 제외)가 기록되면 커널은 모든 데이터를 수락했음을 보장합니다. 다시 말해서:

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>

#define GPIO_EXPORT_PATH "/sys/class/gpio/export"

static int gpio_export(int pin)
{
    char        buffer[32];
    ssize_t     written;
    int         fd;
    char *const q = buffer + sizeof buffer;
    char       *p = buffer + sizeof buffer;

    if (pin < 0)
        return errno = EINVAL;

    *(--p) = '\n';

    do {
        *(--p) = '0' + (pin % 10);
        pin /= 10;
    } while (pin > 0);

    do {
        fd = open(GPIO_EXPORT_PATH, O_WRONLY);
    } while (fd == -1 && errno == EINTR);
    if (fd == -1)
        return errno;

    do {
        written = write(fd, p, (size_t)(q - p));
    } while (written == -1 && errno == EINTR);
    if (written == -1) {
        const int saved_errno = errno;
        close(fd);
        return errno = saved_errno;
    }

    if (close(fd))
        return errno;

    /* Not all written?
     * It is okay if the last char, '\n' was not written. */
    if (written != (ssize_t)(q - p) &&
        written != (ssize_t)(q - 1 - p))
        return errno = EIO; /* Partial write, data not accepted! */

    return errno = 0;
}

를 실행할 때 write()모든 문자(후행 줄 바꿈 제외)가 작성되었는지 확인합니다. 이것이 필요한 원자성 요구 사항입니다. 나는 또한 조심해서 close()그것이 실패하지 않는지 확인하는 것을 좋아합니다. (아직 발생하지는 않았지만 특정 버그를 보고할 수 있는 유일한 방법이므로 해당 버그가 발생하면 언제 보고될지에 대비하고 싶습니다.)

관련 정보