Nios® V プロセッサー・ソフトウェア開発者ハンドブック

ID 743810
日付 7/08/2024
Public
ドキュメント目次

8.7.1.1.1. グローバル・エラー・ステータスの Errno の変更

これらの関数はいずれも、グローバル・ エラー・ステータスの errno を直接変更しません。代わりに、戻り値は、errno.h で提供される適切なエラー コードの否定です。

たとえば、ioctl() 関数は、要求を処理できない場合、errnoENOTTY に直接設定するのではなく、-ENOTTY を返します。これらの関数を呼び出す HAL システムルーチンにより、errno がそれに応じて設定されるようになります。

これらの関数の関数プロトタイプは、それぞれ int ではなく alt_fd* 型の入力ファイル・ディスクリプター引数を取るという点で、アプリケーション・レベルの関数プロトタイプとは異なります。

新しい alt_fd 構造体は、open() の呼び出し時に作成されます。 この構造体のインスタンスは、関連するファイル・ディスクリプターに対して行われるすべての関数呼び出しに入力引数として渡されます。

次のコードは、alt_fd 構造体を定義します。

typedef struct { alt_dev* dev; void* priv; int fd_flags; } alt_fd;

ここでは、

  • dev は使用中のデバイスのデバイスの構造体へのポインターです。
  • fd_flags は、open() に渡される flags の値です。
  • priv は、ドライバーによって定義される予約済みの実装依存の引数です。ドライバーがファイルまたはストリームごとに特別な非 HAL 定義値を維持する必要がある場合、それらをデータ構造に格納し、priv を使用して構造体へのポインターを維持できます。HAL は priv を無視します。

    open() 関数でデータ構造体に向けてストレージを割り当てます (alt_dev 構造体によって指定されます)。close() 関数でストレージを解放します。

注: メモリーリークを回避するには、ファイルまたはストリームが必要なくなったときに close() 関数を呼び出すようにしてください。