what is the “current” in linux kernel source

2019-02-02 08:16发布

I'm studying about linux kernel and I have a problem

I see many linux kernel source files have current->files. So what is the "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;
 }

2条回答
你好瞎i
2楼-- · 2019-02-02 08:24

It's a pointer to the current process (i.e. the process that issued the system call).

On x86, it's defined in arch/x86/include/current.h (similar files for other archs).

#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 */

More information in Linux Device Drivers chapter 2:

The current pointer refers to the user process currently executing. During the execution of a system call, such as open or read, the current process is the one that invoked the call. Kernel code can use process-specific information by using current, if it needs to do so. [...]

查看更多
欢心
3楼-- · 2019-02-02 08:45

Current is a global variable of type struct task_struct. You can find it's definition at [1].

Files is a struct files_struct and it contains information of the files used by the current process.

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

查看更多
登录 后发表回答