76.html

来自「linux 0.11中文版 有注释」· HTML 代码 · 共 358 行 · 第 1/2 页

HTML
358
字号
<a name='L139'>  <b>if</b> (tloc)
<a name='L140'>    <font color='red'>{</font>
<a name='L141'>      <a href='../S/68.html#L34' title='Defined at 34 in kernel/fork.c.'>verify_area</a> (tloc, 4);    <i><font color='green'>// 验证内存容量是否够(这里是4 字节)。</font></i>
<a name='L142'>      <a href='../S/24.html#L62' title='Defined at 62 in include/asm/segment.h.'>put_fs_long</a> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>, (<b>unsigned</b> <b>long</b> *) tloc);  <i><font color='green'>// 也放入用户数据段tloc 处。</font></i>
<a name='L143'>    <font color='red'>}</font>
<a name='L144'>  <b>return</b> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L145'><font color='red'>}</font>
<a name='L146'>
<a name='L147'><i><font color='green'>/*</font></i>
<a name='L148'><i><font color='green'>* Unprivileged users may change the real user id to the effective uid</font></i>
<a name='L149'><i><font color='green'>* or vice versa.</font></i>
<a name='L150'><i><font color='green'>*/</font></i>
<a name='L151'><i><font color='green'>/*</font></i>
<a name='L152'><i><font color='green'>* 无特权的用户可以见实际用户标识符(real uid)改成有效用户标识符(effective uid),反之也然。</font></i>
<a name='L153'><i><font color='green'>*/</font></i>
<a name='L154'><i><font color='green'>// 设置任务的实际以及/或者有效用户ID(uid)。如果任务没有超级用户特权,那么只能互换其</font></i>
<a name='L155'><i><font color='green'>// 实际用户ID 和有效用户ID。如果任务具有超级用户特权,就能任意设置有效的和实际的用户ID。</font></i>
<a name='L156'><i><font color='green'>// 保留的uid(saved uid)被设置成与有效uid 同值。</font></i>
<a name='L157'><b>int</b>
<a name='L158'><a href='../R/675.html' title='Multiple refered from 3 places.'>sys_setreuid</a> (<b>int</b> ruid, <b>int</b> euid)
<a name='L159'><font color='red'>{</font>
<a name='L160'>  <b>int</b> old_ruid = current-&gt;uid;
<a name='L161'>
<a name='L162'>  <b>if</b> (ruid &gt; 0)
<a name='L163'>    <font color='red'>{</font>
<a name='L164'>      <b>if</b> ((current-&gt;euid == ruid) || (old_ruid == ruid) || <a href='../S/34.html#L37' title='Defined at 37 in include/linux/kernel.h.'>suser</a> ())
<a name='L165'>        current-&gt;uid = ruid;
<a name='L166'>      <b>else</b>
<a name='L167'>        <b>return</b> (-<a href='../D/112.html' title='Multiple defined in 2 places.'>EPERM</a>);
<a name='L168'>    <font color='red'>}</font>
<a name='L169'>  <b>if</b> (euid &gt; 0)
<a name='L170'>    <font color='red'>{</font>
<a name='L171'>      <b>if</b> ((old_ruid == euid) || (current-&gt;euid == euid) || <a href='../S/34.html#L37' title='Defined at 37 in include/linux/kernel.h.'>suser</a> ())
<a name='L172'>        current-&gt;euid = euid;
<a name='L173'>      <b>else</b>
<a name='L174'>        <font color='red'>{</font>
<a name='L175'>          current-&gt;uid = old_ruid;
<a name='L176'>          <b>return</b> (-<a href='../D/112.html' title='Multiple defined in 2 places.'>EPERM</a>);
<a name='L177'>        <font color='red'>}</font>
<a name='L178'>    <font color='red'>}</font>
<a name='L179'>  <b>return</b> 0;
<a name='L180'><font color='red'>}</font>
<a name='L181'>
<a name='L182'><i><font color='green'>// 设置任务用户号(uid)。如果任务没有超级用户特权,它可以使用setuid()将其有效uid</font></i>
<a name='L183'><i><font color='green'>// (effective uid)设置成其保留uid(saved uid)或其实际uid(real uid)。如果任务有</font></i>
<a name='L184'><i><font color='green'>// 超级用户特权,则实际uid、有效uid 和保留uid 都被设置成参数指定的uid。</font></i>
<a name='L185'><b>int</b>
<a name='L186'><a href='../R/677.html' title='Multiple refered from 2 places.'>sys_setuid</a> (<b>int</b> uid)
<a name='L187'><font color='red'>{</font>
<a name='L188'>  <b>return</b> (<a href='../S/76.html#L158' title='Defined at 158 in kernel/sys.c.'>sys_setreuid</a> (uid, uid));
<a name='L189'><font color='red'>}</font>
<a name='L190'>
<a name='L191'><i><font color='green'>// 设置系统时间和日期。参数tptr 是从1970 年1 月1 日00:00:00 GMT 开始计时的时间值(秒)。</font></i>
<a name='L192'><i><font color='green'>// 调用进程必须具有超级用户权限。</font></i>
<a name='L193'><b>int</b>
<a name='L194'><a href='../R/684.html' title='Multiple refered from 2 places.'>sys_stime</a> (<b>long</b> *tptr)
<a name='L195'><font color='red'>{</font>
<a name='L196'>  <b>if</b> (!<a href='../S/34.html#L37' title='Defined at 37 in include/linux/kernel.h.'>suser</a> ())                <i><font color='green'>// 如果不是超级用户则出错返回(许可)。</font></i>
<a name='L197'>    <b>return</b> -<a href='../D/112.html' title='Multiple defined in 2 places.'>EPERM</a>;
<a name='L198'>  startup_time = <a href='../S/24.html#L32' title='Defined at 32 in include/asm/segment.h.'>get_fs_long</a> ((<b>unsigned</b> <b>long</b> *) tptr) - jiffies / <a href='../S/36.html#L5' title='Defined at 5 in include/linux/sched.h.'>HZ</a>;
<a name='L199'>  <b>return</b> 0;
<a name='L200'><font color='red'>}</font>
<a name='L201'>
<a name='L202'><i><font color='green'>// 获取当前任务时间。tms 结构中包括用户时间、系统时间、子进程用户时间、子进程系统时间。</font></i>
<a name='L203'><b>int</b>
<a name='L204'><a href='../R/688.html' title='Multiple refered from 2 places.'>sys_times</a> (<b>struct</b> tms *tbuf)
<a name='L205'><font color='red'>{</font>
<a name='L206'>  <b>if</b> (tbuf)
<a name='L207'>    <font color='red'>{</font>
<a name='L208'>      <a href='../S/68.html#L34' title='Defined at 34 in kernel/fork.c.'>verify_area</a> (tbuf, <b>sizeof</b> *tbuf);
<a name='L209'>      <a href='../S/24.html#L62' title='Defined at 62 in include/asm/segment.h.'>put_fs_long</a> (current-&gt;utime, (<b>unsigned</b> <b>long</b> *) &amp;tbuf-&gt;tms_utime);
<a name='L210'>      <a href='../S/24.html#L62' title='Defined at 62 in include/asm/segment.h.'>put_fs_long</a> (current-&gt;stime, (<b>unsigned</b> <b>long</b> *) &amp;tbuf-&gt;tms_stime);
<a name='L211'>      <a href='../S/24.html#L62' title='Defined at 62 in include/asm/segment.h.'>put_fs_long</a> (current-&gt;cutime, (<b>unsigned</b> <b>long</b> *) &amp;tbuf-&gt;tms_cutime);
<a name='L212'>      <a href='../S/24.html#L62' title='Defined at 62 in include/asm/segment.h.'>put_fs_long</a> (current-&gt;cstime, (<b>unsigned</b> <b>long</b> *) &amp;tbuf-&gt;tms_cstime);
<a name='L213'>    <font color='red'>}</font>
<a name='L214'>  <b>return</b> jiffies;
<a name='L215'><font color='red'>}</font>
<a name='L216'>
<a name='L217'><i><font color='green'>// 当参数end_data_seg 数值合理,并且系统确实有足够的内存,而且进程没有超越其最大数据段大小</font></i>
<a name='L218'><i><font color='green'>// 时,该函数设置数据段末尾为end_data_seg 指定的值。该值必须大于代码结尾并且要小于堆栈</font></i>
<a name='L219'><i><font color='green'>// 结尾16KB。返回值是数据段的新结尾值(如果返回值与要求值不同,则表明有错发生)。</font></i>
<a name='L220'><i><font color='green'>// 该函数并不被用户直接调用,而由libc 库函数进行包装,并且返回值也不一样。</font></i>
<a name='L221'><b>int</b>
<a name='L222'><a href='../R/632.html' title='Multiple refered from 2 places.'>sys_brk</a> (<b>unsigned</b> <b>long</b> end_data_seg)
<a name='L223'><font color='red'>{</font>
<a name='L224'>  <b>if</b> (end_data_seg &gt;= current-&gt;end_code &amp;&amp;      <i><font color='green'>// 如果参数&gt;代码结尾,并且</font></i>
<a name='L225'>      end_data_seg &lt; current-&gt;start_stack - 16384)      <i><font color='green'>// 小于堆栈-16KB,</font></i>
<a name='L226'>    current-&gt;brk = end_data_seg;        <i><font color='green'>// 则设置新数据段结尾值。</font></i>
<a name='L227'>  <b>return</b> current-&gt;brk;          <i><font color='green'>// 返回进程当前的数据段结尾值。</font></i>
<a name='L228'><font color='red'>}</font>
<a name='L229'>
<a name='L230'><i><font color='green'>/*</font></i>
<a name='L231'><i><font color='green'>* This needs some heave checking ...</font></i>
<a name='L232'><i><font color='green'>* I just haven't get the stomach for it. I also don't fully</font></i>
<a name='L233'><i><font color='green'>* understand sessions/pgrp etc. Let somebody who does explain it.</font></i>
<a name='L234'><i><font color='green'>*/</font></i>
<a name='L235'><i><font color='green'>/*</font></i>
<a name='L236'><i><font color='green'>* 下面代码需要某些严格的检查…</font></i>
<a name='L237'><i><font color='green'>* 我只是没有胃口来做这些。我也不完全明白sessions/pgrp 等。还是让了解它们的人来做吧。</font></i>
<a name='L238'><i><font color='green'>*/</font></i>
<a name='L239'><i><font color='green'>// 将参数pid 指定进程的进程组ID 设置成pgid。如果参数pid=0,则使用当前进程号。如果</font></i>
<a name='L240'><i><font color='green'>// pgid 为0,则使用参数pid 指定的进程的组ID 作为pgid。如果该函数用于将进程从一个</font></i>
<a name='L241'><i><font color='green'>// 进程组移到另一个进程组,则这两个进程组必须属于同一个会话(session)。在这种情况下,</font></i>
<a name='L242'><i><font color='green'>// 参数pgid 指定了要加入的现有进程组ID,此时该组的会话ID 必须与将要加入进程的相同(193 行)。</font></i>
<a name='L243'><b>int</b>
<a name='L244'><a href='../R/673.html' title='Multiple refered from 2 places.'>sys_setpgid</a> (<b>int</b> pid, <b>int</b> pgid)
<a name='L245'><font color='red'>{</font>
<a name='L246'>  <b>int</b> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L247'>
<a name='L248'>  <b>if</b> (!pid)                     <i><font color='green'>// 如果参数pid=0,则使用当前进程号。</font></i>
<a name='L249'>    pid = current-&gt;pid;
<a name='L250'>  <b>if</b> (!pgid)                    <i><font color='green'>// 如果pgid 为0,则使用当前进程pid 作为pgid。</font></i>
<a name='L251'>    pgid = current-&gt;pid;        <i><font color='green'>// [??这里与POSIX 的描述有出入]</font></i>
<a name='L252'>  <b>for</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> = 0; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> &lt; <a href='../S/36.html#L4' title='Defined at 4 in include/linux/sched.h.'>NR_TASKS</a>; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>++)        <i><font color='green'>// 扫描任务数组,查找指定进程号的任务。</font></i>
<a name='L253'>    <b>if</b> (task[<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>] &amp;&amp; task[<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>]-&gt;pid == pid)
<a name='L254'>      <font color='red'>{</font>
<a name='L255'>        <b>if</b> (task[<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>]-&gt;leader)    <i><font color='green'>// 如果该任务已经是首领,则出错返回。</font></i>
<a name='L256'>          <b>return</b> -<a href='../D/112.html' title='Multiple defined in 2 places.'>EPERM</a>;
<a name='L257'>        <b>if</b> (task[<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>]-&gt;session != current-&gt;session)       <i><font color='green'>// 如果该任务的会话ID</font></i>
<a name='L258'>          <b>return</b> -<a href='../D/112.html' title='Multiple defined in 2 places.'>EPERM</a>;        <i><font color='green'>// 与当前进程的不同,则出错返回。</font></i>
<a name='L259'>        task[<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>]-&gt;pgrp = pgid;   <i><font color='green'>// 设置该任务的pgrp。</font></i>
<a name='L260'>        <b>return</b> 0;
<a name='L261'>      <font color='red'>}</font>
<a name='L262'>  <b>return</b> -<a href='../S/28.html#L32' title='Defined at 32 in include/errno.h.'>ESRCH</a>;
<a name='L263'><font color='red'>}</font>
<a name='L264'>
<a name='L265'><i><font color='green'>// 返回当前进程的组号。与getpgid(0)等同。</font></i>
<a name='L266'><b>int</b>
<a name='L267'><a href='../R/648.html' title='Multiple refered from 2 places.'>sys_getpgrp</a> (<b>void</b>)
<a name='L268'><font color='red'>{</font>
<a name='L269'>  <b>return</b> current-&gt;pgrp;
<a name='L270'><font color='red'>}</font>
<a name='L271'>
<a name='L272'><i><font color='green'>// 创建一个会话(session)(即设置其leader=1),并且设置其会话=其组号=其进程号。</font></i>
<a name='L273'><b>int</b>
<a name='L274'><a href='../R/676.html' title='Multiple refered from 2 places.'>sys_setsid</a> (<b>void</b>)
<a name='L275'><font color='red'>{</font>
<a name='L276'>  <b>if</b> (current-&gt;leader &amp;&amp; !<a href='../S/34.html#L37' title='Defined at 37 in include/linux/kernel.h.'>suser</a> ())     <i><font color='green'>// 如果当前进程已是会话首领并且不是超级用户</font></i>
<a name='L277'>    <b>return</b> -<a href='../D/112.html' title='Multiple defined in 2 places.'>EPERM</a>;              <i><font color='green'>// 则出错返回。</font></i>
<a name='L278'>  current-&gt;leader = 1;          <i><font color='green'>// 设置当前进程为新会话首领。</font></i>
<a name='L279'>  current-&gt;session = current-&gt;pgrp = current-&gt;pid;      <i><font color='green'>// 设置本进程session = pid。</font></i>
<a name='L280'>  current-&gt;<a href='../S/7.html#L44' title='Defined at 44 in fs/char_dev.c.'>tty</a> = -1;            <i><font color='green'>// 表示当前进程没有控制终端。</font></i>
<a name='L281'>  <b>return</b> current-&gt;pgrp;         <i><font color='green'>// 返回会话ID。</font></i>
<a name='L282'><font color='red'>}</font>
<a name='L283'>
<a name='L284'><i><font color='green'>// 获取系统信息。其中utsname 结构包含5 个字段,分别是:本版本操作系统的名称、网络节点名称、</font></i>
<a name='L285'><i><font color='green'>// 当前发行级别、版本级别和硬件类型名称。</font></i>
<a name='L286'><b>int</b>
<a name='L287'><a href='../R/692.html' title='Multiple refered from 2 places.'>sys_uname</a> (<b>struct</b> utsname *name)
<a name='L288'><font color='red'>{</font>
<a name='L289'>  <b>static</b> <b>struct</b> utsname thisname = <font color='red'>{</font>    <i><font color='green'>// 这里给出了结构中的信息,这种编码肯定会改变。</font></i>
<a name='L290'>    "linux .0", "nodename", "release ", "version ", "machine "
<a name='L291'>  <font color='red'>}</font>;
<a name='L292'>  <b>int</b> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L293'>
<a name='L294'>  <b>if</b> (!name)
<a name='L295'>    <b>return</b> -<a href='../S/28.html#L29' title='Defined at 29 in include/errno.h.'>ERROR</a>;              <i><font color='green'>// 如果存放信息的缓冲区指针为空则出错返回。</font></i>
<a name='L296'>  <a href='../S/68.html#L34' title='Defined at 34 in kernel/fork.c.'>verify_area</a> (name, <b>sizeof</b> *name);     <i><font color='green'>// 验证缓冲区大小是否超限(超出已分配的内存等)。</font></i>
<a name='L297'>  <b>for</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> = 0; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> &lt; <b>sizeof</b> *name; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>++)    <i><font color='green'>// 将utsname 中的信息逐字节复制到用户缓冲区中。</font></i>
<a name='L298'>    <a href='../S/24.html#L44' title='Defined at 44 in include/asm/segment.h.'>put_fs_byte</a> (((<b>char</b> *) &amp;thisname)[<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>], <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> + (<b>char</b> *) name);
<a name='L299'>  <b>return</b> 0;
<a name='L300'><font color='red'>}</font>
<a name='L301'>
<a name='L302'><i><font color='green'>// 设置当前进程创建文件属性屏蔽码为mask &amp; 0777。并返回原屏蔽码。</font></i>
<a name='L303'><b>int</b>
<a name='L304'><a href='../R/690.html' title='Multiple refered from 2 places.'>sys_umask</a> (<b>int</b> mask)
<a name='L305'><font color='red'>{</font>
<a name='L306'>  <b>int</b> old = current-&gt;umask;
<a name='L307'>
<a name='L308'>  current-&gt;umask = mask &amp; 0777;
<a name='L309'>  <b>return</b> (old);
<a name='L310'><font color='red'>}</font>
</pre>
<hr>
<a name='BOTTOM'>
<i><font color='green'>/* [&lt;][&gt;]<a href='#L19'>[^]</a><a href='#L304'>[v]</a><a href='#TOP'>[top]</a>[bottom]<a href='../mains.html'>[index]</a><a href='../help.html'>[help]</a> */</font></i>
</body>
</html>

⌨️ 快捷键说明

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