1

Linux での C プログラミングの冒険のある時点で、ファイル記述子の読み取りと書き込みを中断できないようにするフラグ (おそらくioctl/ fcntl?) に遭遇しました。

残念ながら、これを行う方法やどこで読んだか思い出せません。誰でも光を当てることができますか?

Update0

私のクエリを改良するために、私は同じブロッキングを求めており、それを保証し、ユーザー空間のバッファリングfwrite()を提供しません。fread()

4

2 に答える 2

1

すべてのシグナルハンドラーがのフラグでインストールされていることを確認することEINTRread()、回避できます。write()SA_RESTARTsigaction()

ただし、これは短い読み取り/書き込みからユーザーを保護しません。read()これは、 /をループに入れることによってのみ可能です( /呼び出しwrite()にすでに提供されている必要があるバッファー以外の追加のバッファーは必要ありません)。read()write()

このようなループは次のようになります。

/* If return value is less than `count', then errno == 0 indicates end of file,
 * otherwise errno indicates the error that occurred. */
ssize_t hard_read(int fd, void *buf, size_t count)
{
    ssize_t rv;
    ssize_t total_read = 0;

    while (total_read < count)
    {
        rv = read(fd, (char *)buf + total_read, count - total_read);

        if (rv == 0)
            errno = 0;

        if (rv < 1)
            if (errno == EINTR)
                continue;
            else
                break;

        total_read += rv;
    }

    return rv;
}
于 2010-07-31T04:38:54.817 に答える
0

読み取り/書き込み中の割り込みを無効にしますか、それともあなたがいる間は他の誰もファイルを読み取り/書き込みしないことを保証しますか?

2つ目は、fcntl()のF_GETLK、F_SETLK、およびF_SETLKWを使用して、それぞれレコードロックの取得、解放、およびテストを行うことができます。ただし、POSIXロックは単なる助言であるため、Linuxはそれらを強制しません。これは、協調するプロセス間でのみ意味があります。

最初のタスクは、リングゼロに飛び込み、ローカルプロセッサ(またはSMPシステムを使用している場合はすべて)で割り込みを無効にすることです。完了したら、それらを再度有効にすることを忘れないでください。

于 2010-07-30T15:35:28.263 に答える