process mngr misc

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;
    }

子进程/线程名字

1. fork子进程/线程时,子进程/线程默认的名字是父进程/线程的

其对应code位置

copy_process()
    p = dup_task_struct(current, node);

调用:
int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
{
    if (current->mm)
        fpsimd_preserve_current_state();
    *dst = *src;

 2.子进程如果调用了execve了,会在这个系统调用里修改自己的进程名字,code位置如下:

load_elf_binary
setup_new_exec
    __set_task_comm(current, kbasename(bprm->filename), true);

usersapce线程可以用prctl(PR_SET_NAME)系统调用修改自己的名字,code位置如下:

prctl
    case PR_SET_NAME:
        comm[sizeof(me->comm) - 1] = 0;
        if (strncpy_from_user(comm, (char __user *)arg2,
                      sizeof(me->comm) - 1) < 0)
            return -EFAULT;
        set_task_comm(me, comm);
        proc_comm_connector(me);
        break;

子进程调用exec将free掉之前fork时复制的mmap等资源

其调用stack如下:

(exec系统调用一般是子进程fork出来后,子进程自己调用的)

[<0000000052cf3919>] anon_vma_interval_tree_remove+0x138/0x2f8
[<000000009161274c>] unlink_anon_vmas+0xcc/0x1f4
[<00000000fb6d0e95>] free_pgtables+0x1c4/0x294
[<00000000001c233d>] exit_mmap+0x1ec/0x370
[<00000000cbc6e3ef>] mmput+0xa4/0x1b8
[<00000000e97dcb28>] flush_old_exec+0xa30/0x1344
[<000000005d4a03f6>] load_elf_binary+0x4fc/0x1a88
[<00000000c48e456a>] search_binary_handler+0x164/0x3c0
[<000000005f8d85da>] __do_execve_file+0xa74/0xdc0
[<00000000b1b6ce08>] __arm64_sys_execve+0x4c/0x5c
[<00000000de73212a>] el0_svc_common+0xb8/0x1b8
[<0000000094ac3c9f>] el0_svc_handler+0x74/0x90
[<000000004da44397>] el0_svc+0x8/0x340

task_struct.exit_state

此struct中的exit_state成员是int类型,它的值在进程正常运行时是0,在进程退出时的值是EXIT_ZOMBIE或者EXIT_DEAD

原文地址:https://www.cnblogs.com/aspirs/p/15759141.html