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

おすすめ記事