📄 exit.htm
字号:
<a name=L90 href="source/kernel/exit.c#L90">90</a> continue; <a name=L91 href="source/kernel/exit.c#L91">91</a> if (<a href="ident?i=task">task</a>[i]->pid != pid) <a name=L92 href="source/kernel/exit.c#L92">92</a> continue; <a name=L93 href="source/kernel/exit.c#L93">93</a> <a href="ident?i=task">task</a>[i]->signal |= (1<<(<a href="ident?i=SIGCHLD">SIGCHLD</a>-1)); <a name=L94 href="source/kernel/exit.c#L94">94</a> return; <a name=L95 href="source/kernel/exit.c#L95">95</a> } <a name=L96 href="source/kernel/exit.c#L96">96</a> <b><i>/* if we don't find any fathers, we just release ourselves */</i></b> <a name=L97 href="source/kernel/exit.c#L97">97</a> <b><i>/* This is not really OK. Must change it to make father 1 */</i></b> <a name=L98 href="source/kernel/exit.c#L98">98</a> <a href="ident?i=printk">printk</a>(<i>"BAD BAD - no father found\n\r"</i>); <a name=L99 href="source/kernel/exit.c#L99">99</a> <a href="ident?i=release">release</a>(<a href="ident?i=current">current</a>);<a name=L100 href="source/kernel/exit.c#L100">100</a> }<a name=L101 href="source/kernel/exit.c#L101">101</a> <a name=L102 href="source/kernel/exit.c#L102">102</a> int <a href="ident?i=do_exit">do_exit</a>(long code)<a name=L103 href="source/kernel/exit.c#L103">103</a> {<a name=L104 href="source/kernel/exit.c#L104">104</a> int i;<a name=L105 href="source/kernel/exit.c#L105">105</a> <a name=L106 href="source/kernel/exit.c#L106">106</a> <a href="ident?i=free_page_tables">free_page_tables</a>(<a href="ident?i=get_base">get_base</a>(<a href="ident?i=current">current</a>->ldt[1]),<a href="ident?i=get_limit">get_limit</a>(0x0f));<a name=L107 href="source/kernel/exit.c#L107">107</a> <a href="ident?i=free_page_tables">free_page_tables</a>(<a href="ident?i=get_base">get_base</a>(<a href="ident?i=current">current</a>->ldt[2]),<a href="ident?i=get_limit">get_limit</a>(0x17));<a name=L108 href="source/kernel/exit.c#L108">108</a> for (i=0 ; i<<a href="ident?i=NR_TASKS">NR_TASKS</a> ; i++)<a name=L109 href="source/kernel/exit.c#L109">109</a> if (<a href="ident?i=task">task</a>[i] && <a href="ident?i=task">task</a>[i]->father == <a href="ident?i=current">current</a>->pid) {<a name=L110 href="source/kernel/exit.c#L110">110</a> <a href="ident?i=task">task</a>[i]->father = 1;<a name=L111 href="source/kernel/exit.c#L111">111</a> if (<a href="ident?i=task">task</a>[i]-><a href="ident?i=state">state</a> == <a href="ident?i=TASK_ZOMBIE">TASK_ZOMBIE</a>)<a name=L112 href="source/kernel/exit.c#L112">112</a> <b><i>/* assumption task[1] is always init */</i></b><a name=L113 href="source/kernel/exit.c#L113">113</a> (void) <a href="ident?i=send_sig">send_sig</a>(<a href="ident?i=SIGCHLD">SIGCHLD</a>, <a href="ident?i=task">task</a>[1], 1);<a name=L114 href="source/kernel/exit.c#L114">114</a> }<a name=L115 href="source/kernel/exit.c#L115">115</a> for (i=0 ; i<<a href="ident?i=NR_OPEN">NR_OPEN</a> ; i++)<a name=L116 href="source/kernel/exit.c#L116">116</a> if (<a href="ident?i=current">current</a>->filp[i])<a name=L117 href="source/kernel/exit.c#L117">117</a> <a href="ident?i=sys_close">sys_close</a>(i);<a name=L118 href="source/kernel/exit.c#L118">118</a> <a href="ident?i=iput">iput</a>(<a href="ident?i=current">current</a>->pwd);<a name=L119 href="source/kernel/exit.c#L119">119</a> <a href="ident?i=current">current</a>->pwd=<a href="ident?i=NULL">NULL</a>;<a name=L120 href="source/kernel/exit.c#L120">120</a> <a href="ident?i=iput">iput</a>(<a href="ident?i=current">current</a>->root);<a name=L121 href="source/kernel/exit.c#L121">121</a> <a href="ident?i=current">current</a>->root=<a href="ident?i=NULL">NULL</a>;<a name=L122 href="source/kernel/exit.c#L122">122</a> <a href="ident?i=iput">iput</a>(<a href="ident?i=current">current</a>->executable);<a name=L123 href="source/kernel/exit.c#L123">123</a> <a href="ident?i=current">current</a>->executable=<a href="ident?i=NULL">NULL</a>;<a name=L124 href="source/kernel/exit.c#L124">124</a> if (<a href="ident?i=current">current</a>->leader && <a href="ident?i=current">current</a>->tty >= 0)<a name=L125 href="source/kernel/exit.c#L125">125</a> <a href="ident?i=tty_table">tty_table</a>[<a href="ident?i=current">current</a>->tty].pgrp = 0;<a name=L126 href="source/kernel/exit.c#L126">126</a> if (<a href="ident?i=last_task_used_math">last_task_used_math</a> == <a href="ident?i=current">current</a>)<a name=L127 href="source/kernel/exit.c#L127">127</a> <a href="ident?i=last_task_used_math">last_task_used_math</a> = <a href="ident?i=NULL">NULL</a>;<a name=L128 href="source/kernel/exit.c#L128">128</a> if (<a href="ident?i=current">current</a>->leader)<a name=L129 href="source/kernel/exit.c#L129">129</a> <a href="ident?i=kill_session">kill_session</a>();<a name=L130 href="source/kernel/exit.c#L130">130</a> <a href="ident?i=current">current</a>-><a href="ident?i=state">state</a> = <a href="ident?i=TASK_ZOMBIE">TASK_ZOMBIE</a>;<a name=L131 href="source/kernel/exit.c#L131">131</a> <a href="ident?i=current">current</a>->exit_code = code;<a name=L132 href="source/kernel/exit.c#L132">132</a> <a href="ident?i=tell_father">tell_father</a>(<a href="ident?i=current">current</a>->father);<a name=L133 href="source/kernel/exit.c#L133">133</a> <a href="ident?i=schedule">schedule</a>();<a name=L134 href="source/kernel/exit.c#L134">134</a> return (-1); <b><i>/* just to suppress warnings */</i></b><a name=L135 href="source/kernel/exit.c#L135">135</a> }<a name=L136 href="source/kernel/exit.c#L136">136</a> <a name=L137 href="source/kernel/exit.c#L137">137</a> int <a href="ident?i=sys_exit">sys_exit</a>(int error_code)<a name=L138 href="source/kernel/exit.c#L138">138</a> {<a name=L139 href="source/kernel/exit.c#L139">139</a> return <a href="ident?i=do_exit">do_exit</a>((error_code&0xff)<<8);<a name=L140 href="source/kernel/exit.c#L140">140</a> }<a name=L141 href="source/kernel/exit.c#L141">141</a> <a name=L142 href="source/kernel/exit.c#L142">142</a> int <a href="ident?i=sys_waitpid">sys_waitpid</a>(<a href="ident?i=pid_t">pid_t</a> pid,unsigned long * stat_addr, int options)<a name=L143 href="source/kernel/exit.c#L143">143</a> {<a name=L144 href="source/kernel/exit.c#L144">144</a> int flag, code;<a name=L145 href="source/kernel/exit.c#L145">145</a> struct <a href="ident?i=task_struct">task_struct</a> ** p;<a name=L146 href="source/kernel/exit.c#L146">146</a> <a name=L147 href="source/kernel/exit.c#L147">147</a> <a href="ident?i=verify_area">verify_area</a>(stat_addr,4);<a name=L148 href="source/kernel/exit.c#L148">148</a> repeat:<a name=L149 href="source/kernel/exit.c#L149">149</a> flag=0;<a name=L150 href="source/kernel/exit.c#L150">150</a> for(p = &<a href="ident?i=LAST_TASK">LAST_TASK</a> ; p > &<a href="ident?i=FIRST_TASK">FIRST_TASK</a> ; --p) {<a name=L151 href="source/kernel/exit.c#L151">151</a> if (!*p || *p == <a href="ident?i=current">current</a>)<a name=L152 href="source/kernel/exit.c#L152">152</a> continue;<a name=L153 href="source/kernel/exit.c#L153">153</a> if ((*p)->father != <a href="ident?i=current">current</a>->pid)<a name=L154 href="source/kernel/exit.c#L154">154</a> continue;<a name=L155 href="source/kernel/exit.c#L155">155</a> if (pid>0) {<a name=L156 href="source/kernel/exit.c#L156">156</a> if ((*p)->pid != pid)<a name=L157 href="source/kernel/exit.c#L157">157</a> continue;<a name=L158 href="source/kernel/exit.c#L158">158</a> } else if (!pid) {<a name=L159 href="source/kernel/exit.c#L159">159</a> if ((*p)->pgrp != <a href="ident?i=current">current</a>->pgrp)<a name=L160 href="source/kernel/exit.c#L160">160</a> continue;<a name=L161 href="source/kernel/exit.c#L161">161</a> } else if (pid != -1) {<a name=L162 href="source/kernel/exit.c#L162">162</a> if ((*p)->pgrp != -pid)<a name=L163 href="source/kernel/exit.c#L163">163</a> continue;<a name=L164 href="source/kernel/exit.c#L164">164</a> }<a name=L165 href="source/kernel/exit.c#L165">165</a> switch ((*p)-><a href="ident?i=state">state</a>) {<a name=L166 href="source/kernel/exit.c#L166">166</a> case <a href="ident?i=TASK_STOPPED">TASK_STOPPED</a>:<a name=L167 href="source/kernel/exit.c#L167">167</a> if (!(options & <a href="ident?i=WUNTRACED">WUNTRACED</a>))<a name=L168 href="source/kernel/exit.c#L168">168</a> continue;<a name=L169 href="source/kernel/exit.c#L169">169</a> <a href="ident?i=put_fs_long">put_fs_long</a>(0x7f,stat_addr);<a name=L170 href="source/kernel/exit.c#L170">170</a> return (*p)->pid;<a name=L171 href="source/kernel/exit.c#L171">171</a> case <a href="ident?i=TASK_ZOMBIE">TASK_ZOMBIE</a>:<a name=L172 href="source/kernel/exit.c#L172">172</a> <a href="ident?i=current">current</a>->cutime += (*p)-><a href="ident?i=utime">utime</a>;<a name=L173 href="source/kernel/exit.c#L173">173</a> <a href="ident?i=current">current</a>->cstime += (*p)-><a href="ident?i=stime">stime</a>;<a name=L174 href="source/kernel/exit.c#L174">174</a> flag = (*p)->pid;<a name=L175 href="source/kernel/exit.c#L175">175</a> code = (*p)->exit_code;<a name=L176 href="source/kernel/exit.c#L176">176</a> <a href="ident?i=release">release</a>(*p);<a name=L177 href="source/kernel/exit.c#L177">177</a> <a href="ident?i=put_fs_long">put_fs_long</a>(code,stat_addr);<a name=L178 href="source/kernel/exit.c#L178">178</a> return flag;<a name=L179 href="source/kernel/exit.c#L179">179</a> default:<a name=L180 href="source/kernel/exit.c#L180">180</a> flag=1;<a name=L181 href="source/kernel/exit.c#L181">181</a> continue;<a name=L182 href="source/kernel/exit.c#L182">182</a> }<a name=L183 href="source/kernel/exit.c#L183">183</a> }<a name=L184 href="source/kernel/exit.c#L184">184</a> if (flag) {<a name=L185 href="source/kernel/exit.c#L185">185</a> if (options & <a href="ident?i=WNOHANG">WNOHANG</a>)<a name=L186 href="source/kernel/exit.c#L186">186</a> return 0;<a name=L187 href="source/kernel/exit.c#L187">187</a> <a href="ident?i=current">current</a>-><a href="ident?i=state">state</a>=<a href="ident?i=TASK_INTERRUPTIBLE">TASK_INTERRUPTIBLE</a>;<a name=L188 href="source/kernel/exit.c#L188">188</a> <a href="ident?i=schedule">schedule</a>();<a name=L189 href="source/kernel/exit.c#L189">189</a> if (!(<a href="ident?i=current">current</a>->signal &= ~(1<<(<a href="ident?i=SIGCHLD">SIGCHLD</a>-1))))<a name=L190 href="source/kernel/exit.c#L190">190</a> goto repeat;<a name=L191 href="source/kernel/exit.c#L191">191</a> else<a name=L192 href="source/kernel/exit.c#L192">192</a> return -<a href="ident?i=EINTR">EINTR</a>;<a name=L193 href="source/kernel/exit.c#L193">193</a> }<a name=L194 href="source/kernel/exit.c#L194">194</a> return -<a href="ident?i=ECHILD">ECHILD</a>;<a name=L195 href="source/kernel/exit.c#L195">195</a> }<a name=L196 href="source/kernel/exit.c#L196">196</a> <a name=L197 href="source/kernel/exit.c#L197">197</a> <a name=L198 href="source/kernel/exit.c#L198">198</a> </pre><hr><div align=center> [<b><i>源代码浏览</i></b>] [<a href="diff/kernel/exit.c">区别标定</a>] [<a href="ident">标识符搜索</a>] [<a href="search">文本搜索</a>] [<a href="find">文件搜索</a>] </div><hr>本网页由 <a href="http:blurb.html">LXR引擎</a> 自动生成.<br></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -