主机参考:VPS测评参考推荐/专注分享VPS服务器优惠信息!若您是商家可以在本站进行投稿,查看详情!此外我们还提供软文收录、PayPal代付、广告赞助等服务,查看详情! |
我们发布的部分优惠活动文章可能存在时效性,购买时建议在本站搜索商家名称可查看相关文章充分了解该商家!若非中文页面可使用Edge浏览器同步翻译!PayPal代付/收录合作 |
在Linux中,新过程主要是通过叉功能创建的。 每个过程对应于内核内的PCB块,并且内核通过PCB块的操作来管理该过程。 在Linux内核中,PCB的相应结构是task_struct,这就是所谓的过程描述符。 该数据结构包含与过程相关的所有信息。这包括描述过程属性和指针到其他与过程相关结构的多个字段。 因此,过程描述符的内部结构非常复杂。 该结构的声明可以在include/linux/sched.h文件中找到。
在Linux上,新过程主要由Fork功能创建。 每个过程对应于内核内的PCB块,并且内核通过PCB块的操作来管理该过程。 在Linux内核中,PCB的相应结构是task_struct,这就是所谓的过程描述符。 该数据结构包含与过程相关的所有信息。这包括描述过程属性和指针到其他与过程相关结构的多个字段。 因此,过程描述符的内部结构非常复杂。 该结构的声明可以在include/linux/sched.h文件中找到。
task_struct结构包含一个指针MM到MM_STRUCT结构。这用于描述过程的内存管理信息。 FS_STRUCT结构的指针FS。这用于描述该过程当前所在的目录。 指针文件是用于files_struct结构的文件,用于描述进程打开的所有文件。 应该注意的是,在操作过程中,过程可能位于不同状态,例如task_running,task_stopped,task_traced。
在用户状态中,可以使用fork()函数创建进程。 此外,您可以通过vfork()和clone()函数创建新过程。 GLIBC库提供了三个API特征叉,VFORK和克隆,每个库都封装了同一名称系统呼叫fork()。 这些功能是合适的同一场景。 例如,子进程可能需要复制父进程的整个地址空间,但是在创建效率低下后立即运行EXEC家族功能。 复制技术满足了这一需求,并减少了地址空间复制的开销。 VFORK创建的子进程完全共享父进程的地址空间或父进程的页面表条目。父母和子过程对数据的更改相互影响。 克隆功能在创建子进程时提供了更大的灵活性,并通过传递各种参数允许选择性复制父进程资源。 内核中的相应服务例程分别为sys_fork(),sys_vfork()和sys_clone()。 例如,sys_fork()的声明为:(位于Arch/x86/kernel/crocess.c):
int sys_fork(struct pt_regs *regs){return do_fork(sigchld,regs- regs- regs-> sp,reg,reg,reg,reg,0,0,null,null,null); do_fork(clone_vfork | clone_vm | sigchld, regs->sp, regs, 0, null, null);}
sys_clone(unsigned long clone_flags, unsigned long newsp, void user parent_tid, void em>emgs (!newsp)newsp = regs->sp; return do_fork(clone_flags,newsp,regs,0,parent_tid,child_tid);}
您可以看到do_fork()函数由以上三个服务函数调用。 do_fork()是内核创建过程的核心函数。 呼叫过程如下:分析4.x Linux源代码的最新版本:在I386体系结构中,SYSCALL通过0x80中断调用:
从图中获取,我们可以看到do_fork()和copy_process()和copy_process()是本文中的主要分析对象。
do_fork函数的主要任务是将原始过程复制到新过程。 在函数的开头,定义了Type_struct的指针P,并接收分配给新过程(子程序)的过程描述符。 此时,您需要检查是否正在跟踪Clone_flags,即Ptrace。 PTRACE用于标记是否通过另一个过程跟踪一个过程。 跟踪的最常见示例是调试过程由调试过程跟踪。 如果PTRACE字段非零,则表示调试程序正在跟踪父进程。接下来,使用fork_traceflag函数检测是否还应跟踪子进程。 如果跟踪为1,则将跟踪flag clone_ptrace添加到标志变量clone_flags中。 否则,您可以执行该过程的创建。也就是说,您可以调用copy_process()。
long _do_fork(未签名的长clone_flags,unsigned long stack_start,unsigned long stack_ize,int ____user parent_tidptr,int child_tidptr,无签名的长TLS)clone_untrace)clone_untrace))のですね!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! copy_process()函数是如此之大,以至于将写另一篇文章来解释实现。
p = copy_process(clone_flags,stack_start,stack_size,child_tidptr,null,trace,tls);
copy_process函数成功运行时,以下代码继续运行:完整的VFORK定义和初始化。 当您使用VFORK系统调用创建子进程时,必须首先运行子进程。 这是因为VFORK的完成量是在此处完成的。当子进程调用EXEC函数或出口时,将信号发送到父进程。 只有这样,父母的过程才会唤醒。否则,它正在等待。
if(!is_err(p)){struct comomper vfork; struct pid *pid;
vfork_done =&vfork; init_completion(&vfork); get_task_struct(p);}
}
接下来,使用wake_up_new_task函数首先运行父母的一个过程之一。 如果设置了Ptrace,则应通知示踪剂。 如果设置了clone_vfork标志,则会通过等待操作阻止父进程,直到子进程调用exec函数或退出为止。
wake_up_new_task(p); /它已经完成,孩子开始运行。 ptracer /if(necrace(trace))告诉ptrace_event_pid(trace,pid)。 if(clone_flags&clone_vfork){if(!然后,错误代码值得返回ptr_err()并存储在PID中。 返回PID。 这就是为什么父程进程在使用叉系统调用时返回子进程PID的原因。 } else {nr = ptr_err(p);} return nr;}
参考:linuxsyscallsabids
有关PHP速度学习视频的免费教程(向初学者学习)
如何学习PHP? 如何开始PHP? 我在哪里可以学习PHP? 如何立即学习PHP? 不用担心,这是PHP速度学习教程(向初学者学习)。需要它的朋友可以保存和下载并学习它!
下载
这几篇文章你可能也喜欢:
- 如何在DEDECM中构建付费内容读取或下载功能?
- 帝国 CMS模板颜色匹配和视觉优化解决方案(帝国在哪里放置CMS模板文件)
- PHPCMS文章未能发布,引起了“保存数据的例外”。我应该怎么办?
- 部署Jenkins + Docker + Maven + Windows一单击Spring Boot程序到远程Linux服务器
- 使用PHP和MySQL构建照片网站以查看和分类您的作品(基于网站设计的照片网站设计)
本文由主机参考刊发,转载请注明:叉系统呼叫分析(成功的叉电话后返回) https://zhujicankao.com/148219.html
评论前必须登录!
注册