task_struct描述符描述了进程的所有信息,所以task_struct非常复杂, 该数据结构定义在linux/sched.h头文件.
task_struct数据结构中第一个字段是state, 它描述了当前进程的状态.
- TASK_RUNNING(准备执行或者正在cpu执行)
- TASK_INTERRUPTIBLE(可中断的睡眠(即可以通过中断来唤醒进程, 包括软中断))
- TASK_UNINTERRUPTIBLE(该标志和上述标志类似, 但是不能通过信号来改变状态)
- TASK_STOPPED(进程的执行被暂停, 例如进程收到SIGSTOP信号)
- TASK_TRACED(进程的执行已经被调试器暂停)
- EXIT_ZOMBIE(进程的执行被终止.顾名思义该状态只有当进程被终止的时候, 进程才会变为该状态)
- EXIT_DEAD
该字段通常用ptask->state = TASK_*来使用或者通过set_task_state和set_current_state宏.
set_task_state宏定义如下定义:
/* linux/sched.h */
#define set_task_state(tsk, state_value) set_mb((tsk)->state, (state_value))
/* asm/system.h */
#define set_mb(var, value) do { (void) xchg(&var, value); } while (0)
/* asm/cmpxchg.h */
/* xchg宏并不是简单的数据交换指令而是调用了__xchg函数 */
/* __typeof__ 是GNU C的扩展类型类似于C++的decltype, 自动推导出数据类型 */
#define xchg(ptr,v) ((__typeof__(*(ptr)))__xchg((unsigned long)(v),(ptr),sizeof(*(ptr)))
#define __xg(x) ((volatile long *)(x))
/* 该函数根据字节自动匹配, 将ptr的值赋给x, 返回x的值 */
static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
{
switch (size) {
case 1:
__asm__ __volatile__("xchgb %b0,%1"
:"=q" (x)
:"m" (*__xg(ptr)), "0" (x)
:"memory");
&n