私は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()
それが失敗しないことを確認するのが好きです。 (まだ発生していませんが、特定のバグを報告する唯一の方法なので、そのバグが発生したときにいつ報告されるかを準備したいと思います。)