process mngr misc
PID/TGID/PGID/SID
PID:在ps cmd里显示的pid是进程id,它对应kernel task_struct里的tgid成员。task_struct里的pid_t pid成员是线程id,task_struct里的tgid是thread group id,即主线程的id,也即ps cmd里说的进程id。对于主线程,其task_struct里的pid和tgid成员相等
TGID:进程里主线程的pid,也即ps cmd里的进程id
PGID:多个在工作内容上存在关联的进程组成一个进程组,其中的组长进程的pid为PGID,比如shell下通过管道联系起来的多个cmd就会形成一个进程组。可以通过setpgid()创建进程组
SID:多个进程组组成一个会话。可以通过setsid()创建一个session
thread group leader
thread group leader即进程中的主线程,对于这样的线程,应该是在fork一个新进程时,其在fork时应该是没有CLONE_THREAD flag的,所以其task_struct中的group_leader指向它本身;
如果是在一个进程里创建线程,此时fork时应该是带有CLONE_THREAD flag的,所以此时其task_struct的group_leader成员设置为current->group_leader:
copy_process() if (clone_flags & CLONE_THREAD) { p->exit_signal = -1; p->group_leader = current->group_leader; p->tgid = current->tgid; } else { if (clone_flags & CLONE_PARENT) p->exit_signal = current->group_leader->exit_signal; else p->exit_signal = (clone_flags & CSIGNAL); p->group_leader = p; p->tgid = p->pid; }