7

これは奇妙な質問のように聞こえるかもしれませんが、ファイルを開いてみると次のようになります。

int fd;
fd = open("/dev/somedevice", O_RDWR);

私は正確に何を取り戻していますか?私はmanページが言うのを見ることができます:
The open() function shall return a file descriptor for the named file that is the lowest file descriptor not currently open for that process

しかし、それはそれですか?それは単なるものintですか、それとも舞台裏でそれに添付されたデータがありますか?私が尋ねている理由は、ユーザースペースからファイルを開いているコード(Linux / C)を見つけたからです。

//User space code:
int fdC;

if ((fdC = open(DEVICE, O_RDWR)) < 0) {
    printf("Error opening device %s (%s)\n", DEVICE, strerror(errno));
    goto error_exit;
}
while (!fQuit) {
    if ((nRet = read(fdC, &rx_message, 1)) > 0) {

次に、カーネル側で、このモジュール(fdを提供する)マップのファイル操作がn_read()関数に読み込まれます。

struct file_operations can_fops = { 
    owner:      THIS_MODULE,
    lseek:  NULL, 
    read:   n_read,

次に、ファイル記述子がで使用されn_read()ますが、データを取得するためにアクセスされています。

int n_read(struct file *file, char *buffer, size_t count, loff_t *loff)
{
    data_t * dev;

    dev = (data_t*)file->private_data;

だから...私はここで何が起こっているのかを理解しています:

A)から返されるファイル記述子にはopen()、単なる説明的な整数値よりも多くのデータが含まれています。
または
B)ユーザースペースでの「読み取り」の呼び出し間のマッピングは、私が考えているほど単純ではなく、コードがいくつかあります。この方程式にはありません。

私を導くのに役立つかもしれない入力はありますか?

4

3 に答える 3

10

ファイル記述子は単なるint。です。read()カーネルは、ファイルの位置、ファイルの操作( 、、などのsyscallを提供するカーネル関数)などwrite()、すべての関連情報を含むテーブルへのインデックスとして使用します。mmap()

ファイルまたはデバイスをopen()使用すると、カーネルはプロセスの新しいファイル記述子エントリを作成し、ファイル操作を含む内部データを入力します。

、、、などを有効なファイル記述子で使用するread()と、カーネルは、所有しているファイル記述子テーブル(およびファイル記述子のインデックス)のファイル操作に基づいて、呼び出す正しいカーネル内関数を検索するだけです。本当に簡単です。write()mmap()

于 2012-10-02T19:19:42.480 に答える
3

@Nominal Aminalによる既存の良い答えに加えて、それは整数ですが、ファイル記述子テーブルと呼ばれるカーネルの構造のエントリを指します。少なくともLinuxの場合はそうです。その構造体の一部であるいくつかのフィールドのうち、興味深いものは次のとおりです。

FILE * pointer; // descriptor to / from reference counts etc.

FILE *または記述子の1つを指定し、もう1つを返すAPIをフォローすることに興味があるかもしれません

fdからFILE*を取得する方法、およびその逆の方法

于 2012-10-02T19:16:30.883 に答える
1

ただのだと思いますintウィキペディアから:

一般に、ファイル記述子は、開いているすべてのファイルの詳細を含むカーネル常駐データ構造内のエントリのインデックスです。POSIXでは、このデータ構造はファイル記述子テーブルと呼ばれ、各プロセスには独自のファイル記述子テーブルがあります。

于 2012-10-02T18:52:26.073 に答える