![sysfs 파일의 동기 I/O](https://linux55.com/image/86776/sysfs%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20%EB%8F%99%EA%B8%B0%20I%2FO.png)
나는 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_SYNC
sysfs 파일을 열 때 이 플래그가 어떤 영향을 미칩니까? 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()
그것이 실패하지 않는지 확인하는 것을 좋아합니다. (아직 발생하지는 않았지만 특정 버그를 보고할 수 있는 유일한 방법이므로 해당 버그가 발생하면 언제 보고될지에 대비하고 싶습니다.)