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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析