zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    js刷新
    getHibernateTemplate()为NUll
    struts2+hibernate+spring+jquery返回json List列表
    windowopen
    web配置详解
    缓存
    uuid-不好之处
    多对多转化一对多
    多对多拆成两个 多对一
    我的github地址账号和密码
  • 原文地址:https://www.cnblogs.com/aspirs/p/15759141.html
Copyright © 2011-2022 走看看