このページを編集する際は、編集に関する方針に従ってください。

概要

  • linux2.6/fs/open.cにて定義
  • 引数で渡されたファイルを開き、ファイルディスクリプタを返す

引数

  • filename--ファイル名
  • flags--フラグ
    フラグ名説明
    O_ACCMODE0003ファイルアクセスモードのマスク
    O_RDONLY00読み込み専用
    O_WRONLY01書き込み専用
    O_RDWR02読み書き可能
    O_CREAT0100ファイルを作成してオープンする(fcntl()で使えない)
    O_EXCL0200排他的にオープンする(fcntl()で使えない)
    O_NOCTTY0400制御ターミナルを割り当てない(fcntl()で使えない)
    O_TRUNC01000切捨てオープンする(fcntl()で使えない)
    O_APPEND02000アペンド(ファイルの最後に書き込むことが保証される)
    O_NONBLOCK04000POSIX型ノンブロッキングI/O
    O_NDELAYO_NONBLOCKノンブロッキングI/O
    O_SYNC010000データおよび属性のライトスルー キャッシング
    FASYNC020000非同期通知(BSD互換)
    O_DIRECT040000ダイレクトディスクアクセス
    O_LARGEFILE0100000ラージファイルを使用可能にしてファイルシステムをマウントし、 O_LARGEFILE オプションでファイルをオープンすると、ファイルを 2 GB を超えて増やすことができる
    O_DIRECTORY0200000ディレクトリである
    O_NOFOLLOW0400000シンボリックリンクではない
    O_NOATIME01000000最終アクセス時刻 (inode の st_atime) を更新しない
  • mode--ファイル付与されているパーミッション

実装

asmlinkage long sys_open(const char __user * filename, int flags, int mode) {

	char * tmp;
	int fd, error;

#if BITS_PER_LONG != 32

	flags |= O_LARGEFILE;

#endif

	tmp = getname(filename);
  • filenameのパス名をユーザ空間から取得する
	fd = PTR_ERR(tmp);
  • voidへのポインタtmpをエラーコードに変換して返す
	if (!IS_ERR(tmp)) {
  • ポインタtmpの妥当性の確認をする
    • 妥当である場合は0を、そうでない場合は1を返す
    • 詳細はIS_ERR()/linux2.6を参照
		fd = get_unused_fd();
		if (fd >= 0) {
			struct file *f = filp_open(tmp, flags, mode);
			error = PTR_ERR(f);
  • voidへのポインタfをエラーコードに変換して返す
			if (IS_ERR(f))
				goto out_error;
  • ポインタfの妥当性の確認をする
    • 妥当である場合は0を、そうでない場合は1を返す
    • 詳細はIS_ERR()/linux2.6を参照
			fd_install(fd, f);
		}

out:

		putname(tmp);
	}
	return fd;

out_error:

	put_unused_fd(fd);
	fd = error;
	goto out;

}

EXPORT_SYMBOL_GPL(sys_open);

呼出元


履歴

  • 作者:ひら
  • 日付:2006/9/6
  • 対象:2.6.10
    更新日更新者更新内容
    2007/7/1たいら?引数の説明を追記

コメント/タグ?



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-07-15 (水) 12:04:34 (800d)