⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000045.htm

📁 一份很好的linux入门资料
💻 HTM
📖 第 1 页 / 共 5 页
字号:
true&nbsp;because&nbsp;setting&nbsp;state=TASK_RUNNING&nbsp;and&nbsp;placing&nbsp;task&nbsp;on&nbsp;the&nbsp;runq&nbsp;by&nbsp;wake&nbsp;<BR>_up_process()&nbsp;is&nbsp;not&nbsp;atomic&nbsp;so&nbsp;you&nbsp;can&nbsp;see&nbsp;(very&nbsp;briefly)&nbsp;TASK_RUNNING&nbsp;tasks&nbsp;<BR>&nbsp;not&nbsp;yet&nbsp;on&nbsp;the&nbsp;runq.&nbsp;TASK_INTERRUPTIBLE&nbsp;means&nbsp;the&nbsp;task&nbsp;is&nbsp;sleeping&nbsp;but&nbsp;can&nbsp;&nbsp;<BR>be&nbsp;woken&nbsp;up&nbsp;by&nbsp;a&nbsp;signal&nbsp;or&nbsp;by&nbsp;expiry&nbsp;of&nbsp;a&nbsp;timer.&nbsp;TASK_UNINTERRUPTIBLE&nbsp;same&nbsp;a&nbsp;<BR>s&nbsp;TASK_INTERRUPTIBLE,&nbsp;except&nbsp;it&nbsp;cannot&nbsp;be&nbsp;woken&nbsp;up.&nbsp;TASK_ZOMBIE&nbsp;task&nbsp;has&nbsp;ter&nbsp;<BR>minated&nbsp;but&nbsp;has&nbsp;not&nbsp;had&nbsp;its&nbsp;status&nbsp;collected&nbsp;(wait()-ed&nbsp;for)&nbsp;by&nbsp;the&nbsp;parent&nbsp;(&nbsp;<BR>natural&nbsp;or&nbsp;by&nbsp;adoption).&nbsp;TASK_STOPPED&nbsp;task&nbsp;was&nbsp;stopped&nbsp;either&nbsp;due&nbsp;to&nbsp;job&nbsp;con&nbsp;<BR>trol&nbsp;signals&nbsp;or&nbsp;due&nbsp;to&nbsp;ptrace(2).&nbsp;TASK_EXCLUSIVE&nbsp;this&nbsp;is&nbsp;not&nbsp;a&nbsp;separate&nbsp;stat&nbsp;<BR>e&nbsp;but&nbsp;can&nbsp;be&nbsp;OR-ed&nbsp;to&nbsp;either&nbsp;one&nbsp;of&nbsp;the&nbsp;TASK_INTERRUPTIBLE&nbsp;or&nbsp;TASK_UNINTERRU&nbsp;<BR>PTIBLE.&nbsp;This&nbsp;means&nbsp;that&nbsp;when&nbsp;this&nbsp;task&nbsp;is&nbsp;sleeping&nbsp;on&nbsp;a&nbsp;wait&nbsp;queue&nbsp;with&nbsp;many&nbsp;<BR>&nbsp;other&nbsp;tasks,&nbsp;it&nbsp;will&nbsp;be&nbsp;woken&nbsp;up&nbsp;alone&nbsp;instead&nbsp;of&nbsp;causing&nbsp;&quot;thundering&nbsp;herd&quot;&nbsp;<BR>&nbsp;problem&nbsp;by&nbsp;waking&nbsp;up&nbsp;all&nbsp;the&nbsp;waiters.&nbsp;<BR>Task&nbsp;flags&nbsp;contain&nbsp;information&nbsp;about&nbsp;the&nbsp;process&nbsp;states&nbsp;which&nbsp;are&nbsp;not&nbsp;mutual&nbsp;<BR>ly&nbsp;exclusive:&nbsp;<BR>unsigned&nbsp;long&nbsp;flags;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;per&nbsp;process&nbsp;flags,&nbsp;defined&nbsp;below&nbsp;*/&nbsp;<BR>/*&nbsp;<BR>&nbsp;*&nbsp;Per&nbsp;process&nbsp;flags&nbsp;<BR>&nbsp;*/&nbsp;<BR>#define&nbsp;PF_ALIGNWARN&nbsp;&nbsp;&nbsp;&nbsp;0x00000001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Print&nbsp;alignment&nbsp;warning&nbsp;msgs&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Not&nbsp;implemented&nbsp;yet,&nbsp;only&nbsp;for&nbsp;486&nbsp;<BR>*/&nbsp;<BR>#define&nbsp;PF_STARTING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00000002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;being&nbsp;created&nbsp;*/&nbsp;<BR>#define&nbsp;PF_EXITING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00000004&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;getting&nbsp;shut&nbsp;down&nbsp;*/&nbsp;<BR>#define&nbsp;PF_FORKNOEXEC&nbsp;&nbsp;&nbsp;0x00000040&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;forked&nbsp;but&nbsp;didn't&nbsp;exec&nbsp;*/&nbsp;<BR>#define&nbsp;PF_SUPERPRIV&nbsp;&nbsp;&nbsp;&nbsp;0x00000100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;used&nbsp;super-user&nbsp;privileges&nbsp;*/&nbsp;<BR>#define&nbsp;PF_DUMPCORE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00000200&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;dumped&nbsp;core&nbsp;*/&nbsp;<BR>#define&nbsp;PF_SIGNALED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00000400&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;killed&nbsp;by&nbsp;a&nbsp;signal&nbsp;*/&nbsp;<BR>#define&nbsp;PF_MEMALLOC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00000800&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Allocating&nbsp;memory&nbsp;*/&nbsp;<BR>#define&nbsp;PF_VFORK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00001000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Wake&nbsp;up&nbsp;parent&nbsp;in&nbsp;mm_release&nbsp;*/&nbsp;<BR>#define&nbsp;PF_USEDFPU&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00100000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;task&nbsp;used&nbsp;FPU&nbsp;this&nbsp;quantum&nbsp;(SMP)&nbsp;&nbsp;<BR>*/&nbsp;<BR>The&nbsp;fields&nbsp;p-has_cpu,p-processor,&nbsp;p-counter,&nbsp;p-priority,&nbsp;p-policy&nbsp;and&nbsp;p-rt_p&nbsp;<BR>riority&nbsp;are&nbsp;related&nbsp;to&nbsp;the&nbsp;scheduler&nbsp;and&nbsp;will&nbsp;be&nbsp;looked&nbsp;at&nbsp;later.&nbsp;<BR>The&nbsp;fields&nbsp;p-mm&nbsp;and&nbsp;p-active_mm&nbsp;point&nbsp;to&nbsp;the&nbsp;process'&nbsp;address&nbsp;space&nbsp;describe&nbsp;<BR>d&nbsp;by&nbsp;mm_struct&nbsp;structure&nbsp;and&nbsp;to&nbsp;the&nbsp;active&nbsp;address&nbsp;space&nbsp;if&nbsp;the&nbsp;process&nbsp;does&nbsp;<BR>n't&nbsp;have&nbsp;a&nbsp;real&nbsp;one&nbsp;(e.g.&nbsp;kernel&nbsp;threads)&nbsp;-&nbsp;this&nbsp;is&nbsp;to&nbsp;minimize&nbsp;TLB&nbsp;flushes&nbsp;&nbsp;<BR>on&nbsp;switching&nbsp;address&nbsp;spaces&nbsp;when&nbsp;the&nbsp;task&nbsp;is&nbsp;scheduled&nbsp;out.&nbsp;So,&nbsp;if&nbsp;we&nbsp;are&nbsp;sc&nbsp;<BR>heduling-in&nbsp;the&nbsp;kernel&nbsp;thread&nbsp;(which&nbsp;has&nbsp;no&nbsp;p-mm)&nbsp;then&nbsp;its&nbsp;next-active_mm&nbsp;wi&nbsp;<BR>ll&nbsp;be&nbsp;set&nbsp;to&nbsp;the&nbsp;prev-active_mm&nbsp;of&nbsp;the&nbsp;task&nbsp;that&nbsp;was&nbsp;scheduled-out&nbsp;which&nbsp;wil&nbsp;<BR>l&nbsp;be&nbsp;the&nbsp;same&nbsp;as&nbsp;prev-mm&nbsp;if&nbsp;prev-mm&nbsp;!=&nbsp;NULL.&nbsp;The&nbsp;address&nbsp;space&nbsp;can&nbsp;be&nbsp;shared&nbsp;<BR>&nbsp;between&nbsp;threads&nbsp;if&nbsp;CLONE_VM&nbsp;flag&nbsp;is&nbsp;passed&nbsp;to&nbsp;the&nbsp;clone(2)&nbsp;system&nbsp;call&nbsp;or&nbsp;b&nbsp;<BR>y&nbsp;means&nbsp;of&nbsp;vfork(2)&nbsp;system&nbsp;call.&nbsp;<BR>The&nbsp;fields&nbsp;p-exec_domain&nbsp;and&nbsp;p-personality&nbsp;related&nbsp;to&nbsp;the&nbsp;personality&nbsp;of&nbsp;the&nbsp;<BR>&nbsp;task,&nbsp;i.e.&nbsp;to&nbsp;the&nbsp;way&nbsp;certain&nbsp;system&nbsp;calls&nbsp;behave&nbsp;in&nbsp;order&nbsp;to&nbsp;emulate&nbsp;&quot;pers&nbsp;<BR>onality&quot;&nbsp;of&nbsp;foreign&nbsp;flavours&nbsp;of&nbsp;UNIX.&nbsp;<BR>The&nbsp;field&nbsp;p-fs&nbsp;contains&nbsp;filesystem&nbsp;information,&nbsp;which&nbsp;under&nbsp;Linux&nbsp;means&nbsp;thre&nbsp;<BR>e&nbsp;pieces&nbsp;of&nbsp;information:&nbsp;<BR>1.&nbsp;root&nbsp;directory's&nbsp;dentry&nbsp;and&nbsp;mountpoint&nbsp;<BR>2.&nbsp;alternate&nbsp;root&nbsp;directory's&nbsp;dentry&nbsp;and&nbsp;mountpoint&nbsp;<BR>3.&nbsp;current&nbsp;working&nbsp;directory's&nbsp;dentry&nbsp;and&nbsp;mountpoint&nbsp;<BR>Also,&nbsp;this&nbsp;structure&nbsp;includes&nbsp;a&nbsp;reference&nbsp;count&nbsp;because&nbsp;it&nbsp;can&nbsp;be&nbsp;shared&nbsp;bet&nbsp;<BR>ween&nbsp;cloned&nbsp;tasks&nbsp;when&nbsp;CLONE_FS&nbsp;flags&nbsp;are&nbsp;passed&nbsp;to&nbsp;the&nbsp;clone(2)&nbsp;system&nbsp;call&nbsp;<BR>.&nbsp;<BR>The&nbsp;field&nbsp;p-files&nbsp;contains&nbsp;the&nbsp;file&nbsp;descriptor&nbsp;table.&nbsp;This&nbsp;also&nbsp;can&nbsp;be&nbsp;share&nbsp;<BR>d&nbsp;between&nbsp;tasks&nbsp;if&nbsp;CLONE_FILES&nbsp;is&nbsp;specified&nbsp;with&nbsp;clone(2)&nbsp;system&nbsp;call.&nbsp;<BR>The&nbsp;field&nbsp;p-sig&nbsp;contains&nbsp;signal&nbsp;handlers&nbsp;and&nbsp;can&nbsp;be&nbsp;shared&nbsp;between&nbsp;cloned&nbsp;ta&nbsp;<BR>sks&nbsp;by&nbsp;means&nbsp;of&nbsp;CLONE_SIGHAND&nbsp;flag&nbsp;passed&nbsp;to&nbsp;the&nbsp;clone(2)&nbsp;system&nbsp;call.&nbsp;<BR>2.2&nbsp;Creation&nbsp;and&nbsp;termination&nbsp;of&nbsp;tasks&nbsp;and&nbsp;kernel&nbsp;threads&nbsp;<BR>Different&nbsp;books&nbsp;on&nbsp;operating&nbsp;systems&nbsp;define&nbsp;a&nbsp;&quot;process&quot;&nbsp;in&nbsp;different&nbsp;ways,&nbsp;s&nbsp;<BR>tarting&nbsp;from&nbsp;&quot;instance&nbsp;of&nbsp;a&nbsp;program&nbsp;in&nbsp;execution&quot;&nbsp;and&nbsp;ending&nbsp;with&nbsp;&quot;that&nbsp;whic&nbsp;<BR>h&nbsp;is&nbsp;produced&nbsp;by&nbsp;clone(2)&nbsp;or&nbsp;fork(2)&nbsp;system&nbsp;calls&quot;.&nbsp;Under&nbsp;Linux,&nbsp;there&nbsp;are&nbsp;t&nbsp;<BR>hree&nbsp;kinds&nbsp;of&nbsp;processes:&nbsp;<BR>·&nbsp;Idle&nbsp;Thread&nbsp;<BR>·&nbsp;Kernel&nbsp;Threads&nbsp;<BR>·&nbsp;User&nbsp;Tasks&nbsp;<BR>The&nbsp;idle&nbsp;thread&nbsp;is&nbsp;created&nbsp;at&nbsp;compile&nbsp;time&nbsp;for&nbsp;the&nbsp;first&nbsp;CPU&nbsp;and&nbsp;then&nbsp;it&nbsp;is&nbsp;&nbsp;<BR>&quot;manually&quot;&nbsp;created&nbsp;for&nbsp;each&nbsp;CPU&nbsp;by&nbsp;means&nbsp;of&nbsp;arch-specific&nbsp;fork_by_hand()&nbsp;in&nbsp;&nbsp;<BR>arch/i386/kernel/smpboot.c&nbsp;which&nbsp;unrolls&nbsp;fork&nbsp;system&nbsp;call&nbsp;by&nbsp;hand&nbsp;(on&nbsp;some&nbsp;a&nbsp;<BR>rchs).&nbsp;Idle&nbsp;tasks&nbsp;share&nbsp;one&nbsp;init_task&nbsp;structure&nbsp;but&nbsp;have&nbsp;a&nbsp;private&nbsp;TSS&nbsp;struc&nbsp;<BR>ture&nbsp;in&nbsp;per-CPU&nbsp;array&nbsp;init_tss.&nbsp;Idle&nbsp;tasks&nbsp;all&nbsp;have&nbsp;pid&nbsp;=&nbsp;0&nbsp;and&nbsp;no&nbsp;other&nbsp;tas&nbsp;<BR>k&nbsp;can&nbsp;share&nbsp;pid,&nbsp;i.e.&nbsp;use&nbsp;CLONE_PID&nbsp;flag&nbsp;to&nbsp;clone(2).&nbsp;<BR>Kernel&nbsp;threads&nbsp;are&nbsp;created&nbsp;using&nbsp;kernel_thread()&nbsp;function&nbsp;which&nbsp;invokes&nbsp;the&nbsp;&nbsp;<BR>clone&nbsp;system&nbsp;call&nbsp;in&nbsp;kernel&nbsp;mode.&nbsp;Kernel&nbsp;threads&nbsp;usually&nbsp;have&nbsp;no&nbsp;user&nbsp;addres&nbsp;<BR>s&nbsp;space,&nbsp;i.e.&nbsp;p-mm&nbsp;=&nbsp;NULL&nbsp;because&nbsp;they&nbsp;explicitly&nbsp;do&nbsp;exit_mm(),&nbsp;e.g.&nbsp;via&nbsp;dae&nbsp;<BR>monize()&nbsp;function.&nbsp;Kernel&nbsp;threads&nbsp;can&nbsp;always&nbsp;access&nbsp;kernel&nbsp;address&nbsp;space&nbsp;dir&nbsp;<BR>ectly.&nbsp;They&nbsp;are&nbsp;allocated&nbsp;pid&nbsp;numbers&nbsp;in&nbsp;the&nbsp;low&nbsp;range.&nbsp;Running&nbsp;at&nbsp;processor&nbsp;<BR>'s&nbsp;ring&nbsp;0&nbsp;implies&nbsp;that&nbsp;the&nbsp;kernel&nbsp;threads&nbsp;enjoy&nbsp;all&nbsp;the&nbsp;io&nbsp;privileges&nbsp;and&nbsp;ca&nbsp;<BR>nnot&nbsp;be&nbsp;pre-empted&nbsp;by&nbsp;the&nbsp;scheduler.&nbsp;<BR>User&nbsp;tasks&nbsp;are&nbsp;created&nbsp;by&nbsp;means&nbsp;of&nbsp;clone(2)&nbsp;or&nbsp;fork(2)&nbsp;system&nbsp;calls,&nbsp;both&nbsp;of&nbsp;<BR>&nbsp;which&nbsp;internally&nbsp;invoke&nbsp;kernel/fork.c:do_fork().&nbsp;<BR>Let&nbsp;us&nbsp;understand&nbsp;what&nbsp;happens&nbsp;when&nbsp;a&nbsp;user&nbsp;process&nbsp;makes&nbsp;a&nbsp;fork(2)&nbsp;system&nbsp;ca&nbsp;<BR>ll.&nbsp;Although&nbsp;the&nbsp;fork(2)&nbsp;system&nbsp;call&nbsp;is&nbsp;architecture-dependent&nbsp;due&nbsp;to&nbsp;the&nbsp;di&nbsp;<BR>fferent&nbsp;ways&nbsp;of&nbsp;passing&nbsp;user&nbsp;stack&nbsp;and&nbsp;registers,&nbsp;the&nbsp;actual&nbsp;underlying&nbsp;func&nbsp;<BR>tion&nbsp;do_fork()&nbsp;that&nbsp;does&nbsp;the&nbsp;job&nbsp;is&nbsp;portable&nbsp;and&nbsp;is&nbsp;located&nbsp;at&nbsp;kernel/fork.c&nbsp;<BR>.&nbsp;<BR>The&nbsp;following&nbsp;steps&nbsp;are&nbsp;done:&nbsp;<BR>1.&nbsp;Local&nbsp;variable&nbsp;retval&nbsp;is&nbsp;set&nbsp;to&nbsp;-ENOMEM&nbsp;as&nbsp;it&nbsp;is&nbsp;the&nbsp;value&nbsp;errno&nbsp;is&nbsp;set&nbsp;t&nbsp;<BR>o&nbsp;if&nbsp;fork(2)&nbsp;fails&nbsp;to&nbsp;allocate&nbsp;a&nbsp;new&nbsp;task&nbsp;structure&nbsp;<BR>2.&nbsp;if&nbsp;CLONE_PID&nbsp;is&nbsp;set&nbsp;in&nbsp;clone_flags&nbsp;then&nbsp;return&nbsp;an&nbsp;error&nbsp;(-EPERM)&nbsp;unless&nbsp;t&nbsp;<BR>he&nbsp;caller&nbsp;is&nbsp;the&nbsp;idle&nbsp;thread&nbsp;(during&nbsp;boot&nbsp;only).&nbsp;So,&nbsp;normal&nbsp;user&nbsp;threads&nbsp;can&nbsp;<BR>not&nbsp;pass&nbsp;CLONE_PID&nbsp;to&nbsp;clone(2)&nbsp;and&nbsp;expect&nbsp;it&nbsp;to&nbsp;succeed.&nbsp;For&nbsp;fork(2)&nbsp;it&nbsp;is&nbsp;i&nbsp;<BR>rrelevant&nbsp;as&nbsp;clone_flags&nbsp;is&nbsp;set&nbsp;to&nbsp;SIFCHLD&nbsp;-&nbsp;this&nbsp;is&nbsp;only&nbsp;relevant&nbsp;when&nbsp;do_f&nbsp;<BR>ork()&nbsp;is&nbsp;invoked&nbsp;from&nbsp;sys_clone()&nbsp;which&nbsp;passes&nbsp;the&nbsp;clone_flags&nbsp;from&nbsp;the&nbsp;valu&nbsp;<BR>e&nbsp;requested&nbsp;from&nbsp;userspace&nbsp;<BR>3.&nbsp;current-vfork_sem&nbsp;is&nbsp;initialised&nbsp;(it&nbsp;is&nbsp;later&nbsp;cleared&nbsp;in&nbsp;the&nbsp;child).&nbsp;This&nbsp;<BR>&nbsp;is&nbsp;used&nbsp;by&nbsp;sys_vfork()&nbsp;(vfork(2)&nbsp;system&nbsp;call,&nbsp;corresponds&nbsp;to&nbsp;clone_flags&nbsp;=&nbsp;&nbsp;<BR>CLONE_VFORK|CLONE_VM|SIGCHLD)&nbsp;to&nbsp;make&nbsp;the&nbsp;parent&nbsp;sleep&nbsp;until&nbsp;the&nbsp;child&nbsp;does&nbsp;&nbsp;<BR>mm_release()&nbsp;for&nbsp;example&nbsp;as&nbsp;a&nbsp;result&nbsp;of&nbsp;execing&nbsp;another&nbsp;program&nbsp;or&nbsp;exit(2)-i&nbsp;<BR>ng&nbsp;<BR>4.&nbsp;A&nbsp;new&nbsp;task&nbsp;structure&nbsp;is&nbsp;allocated&nbsp;using&nbsp;arch-dependent&nbsp;alloc_task_struct(&nbsp;<BR>)&nbsp;macro,&nbsp;on&nbsp;x86&nbsp;it&nbsp;is&nbsp;just&nbsp;a&nbsp;gfp&nbsp;at&nbsp;GFP_KERNEL&nbsp;priority.&nbsp;This&nbsp;is&nbsp;the&nbsp;first&nbsp;r&nbsp;<BR>eason&nbsp;why&nbsp;fork(2)&nbsp;system&nbsp;call&nbsp;may&nbsp;sleep.&nbsp;If&nbsp;this&nbsp;allocation&nbsp;fails&nbsp;we&nbsp;return&nbsp;&nbsp;<BR>-ENOMEM&nbsp;<BR>5.&nbsp;All&nbsp;the&nbsp;values&nbsp;from&nbsp;current&nbsp;process'&nbsp;task&nbsp;structure&nbsp;are&nbsp;copied&nbsp;into&nbsp;the&nbsp;n&nbsp;<BR>ew&nbsp;one,&nbsp;using&nbsp;structure&nbsp;assignment&nbsp;*p&nbsp;=&nbsp;*current.&nbsp;Perhaps&nbsp;this&nbsp;should&nbsp;be&nbsp;rep&nbsp;<BR>laced&nbsp;by&nbsp;a&nbsp;memset?&nbsp;Later&nbsp;on,&nbsp;the&nbsp;fields&nbsp;that&nbsp;should&nbsp;not&nbsp;be&nbsp;inherited&nbsp;by&nbsp;the&nbsp;&nbsp;<BR>child&nbsp;are&nbsp;set&nbsp;to&nbsp;the&nbsp;correct&nbsp;values&nbsp;<BR>6.&nbsp;Big&nbsp;kernel&nbsp;lock&nbsp;is&nbsp;taken&nbsp;as&nbsp;the&nbsp;rest&nbsp;of&nbsp;the&nbsp;code&nbsp;would&nbsp;otherwise&nbsp;be&nbsp;non-r&nbsp;<BR>eentrant&nbsp;<BR>7.&nbsp;If&nbsp;the&nbsp;parent&nbsp;has&nbsp;user&nbsp;resources&nbsp;(a&nbsp;concept&nbsp;of&nbsp;UID,&nbsp;Linux&nbsp;is&nbsp;flexible&nbsp;eno&nbsp;<BR>ugh&nbsp;to&nbsp;make&nbsp;it&nbsp;a&nbsp;question&nbsp;rather&nbsp;than&nbsp;a&nbsp;fact),&nbsp;then&nbsp;verify&nbsp;if&nbsp;the&nbsp;user&nbsp;excee&nbsp;<BR>ded&nbsp;RLIMIT_NPROC&nbsp;soft&nbsp;limit&nbsp;-&nbsp;if&nbsp;so,&nbsp;fail&nbsp;with&nbsp;-EAGAIN,&nbsp;if&nbsp;not,&nbsp;increment&nbsp;th&nbsp;<BR>e&nbsp;count&nbsp;of&nbsp;processes&nbsp;by&nbsp;given&nbsp;uid&nbsp;p-user-count&nbsp;<BR>8.&nbsp;If&nbsp;the&nbsp;system-wide&nbsp;number&nbsp;of&nbsp;tasks&nbsp;exceeds&nbsp;the&nbsp;value&nbsp;of&nbsp;the&nbsp;tunable&nbsp;max_t&nbsp;<BR>hreads,&nbsp;fail&nbsp;with&nbsp;-EAGAIN&nbsp;<BR>9.&nbsp;If&nbsp;the&nbsp;binary&nbsp;being&nbsp;executed&nbsp;belongs&nbsp;to&nbsp;a&nbsp;modularised&nbsp;execution&nbsp;domain,&nbsp;i&nbsp;<BR>ncrement&nbsp;the&nbsp;corresponding&nbsp;module's&nbsp;reference&nbsp;count&nbsp;<BR>10.&nbsp;If&nbsp;the&nbsp;binary&nbsp;being&nbsp;executed&nbsp;belongs&nbsp;to&nbsp;a&nbsp;modularised&nbsp;binary&nbsp;format,&nbsp;inc&nbsp;<BR>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -