30

Linux カーネルについて勉強していますが、問題があります。

多くの Linux カーネル ソース ファイルにはcurrent->files. だから何currentですか?

struct file *fget(unsigned int fd)
{
     struct file *file;
     struct files_struct *files = current->files;

     rcu_read_lock();
     file = fcheck_files(files, fd);
     if (file) {
             /* File object ref couldn't be taken */
             if (file->f_mode & FMODE_PATH ||
                 !atomic_long_inc_not_zero(&file->f_count))
                     file = NULL;
     }
     rcu_read_unlock();

     return file;
 }
4

2 に答える 2

41

これは、現在のプロセス (つまり、システム コールを発行したプロセス) へのポインターです。

x86 では、arch/x86/include/asm/current.h(他のアーキテクチャの同様のファイル) で定義されています。

#ifndef _ASM_X86_CURRENT_H
#define _ASM_X86_CURRENT_H

#include <linux/compiler.h>
#include <asm/percpu.h>

#ifndef __ASSEMBLY__
struct task_struct;

DECLARE_PER_CPU(struct task_struct *, current_task);

static __always_inline struct task_struct *get_current(void)
{
    return percpu_read_stable(current_task);
}

#define current get_current()

#endif /* __ASSEMBLY__ */

#endif /* _ASM_X86_CURRENT_H */

詳細については、Linux デバイス ドライバーの第 2 章を参照してください。

現在のポインターは、現在実行中のユーザー プロセスを参照します。open や read などのシステム コールの実行中、現在のプロセスはその呼び出しを呼び出したプロセスです。カーネル コードは、必要に応じて current を使用してプロセス固有の情報を使用できます。[...]

于 2012-09-15T05:11:29.190 に答える
3

Currentタイプのグローバル変数ですstruct task_struct。その定義は [1] にあります。

Filesでありstruct files_struct、現在のプロセスで使用されるファイルの情報が含まれています。

[1] http://students.mimuw.edu.pl/SO/LabLinux/PROCESY/ZRODLA/sched.h.html

于 2012-09-15T05:13:17.893 に答える