I am a student doing research involving Linux processes, and I need to learn more about them to proceed with my experiment. In reading a couple books and things online, I've come across task_struct
, which I'm not sure I'm understanding fully, and would like confirmation/correction onto my existing thought.
From what I think I've understood, task_struct
is the C structure that acts as the process descriptor, holding everything the kernel might need to know about a processes. At the end of the process kernel stack lives another struct, thread_info
, which has a pointer to the processes task_struct
.
Another question: how does one access the task_struct
of a process? Is there a calculation to find the location of it's thread_info
? Is there a macro/function within the kernel?
Yes, the task_struct
structure contains all the information about a process. You can obtain a pointer to the structure that describes the current process using the current
macro as follows:
struct task_struct *p = current;
If you want to get the structure that describes a process given a pid
, you can use the find_task_by_vpid
function as follows:
read_lock(&tasklist_lock);
p = find_task_by_vpid(pid);
if (p) get_task_struct(p);
read_unlock(&tasklist_lock);
if (p == NULL) {
// Task not found.
}
// Later, once you're finished with the task, execute:
put_task_struct(p);
Finally, if you want to iterate over all processes, you can use for_each_process
as follows:
read_lock(&tasklist_lock);
for_each_process(p) {
// p is a pointer to a task_struct instance.
}
read_unlock(&tasklist_lock);
If you want to an exclusive access to the task list to be able to make changes to one or more fields in the structure, write_lock_irqsave
must be used instead of read_lock
.