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->uid;
<a name='L161'>
<a name='L162'> <b>if</b> (ruid > 0)
<a name='L163'> <font color='red'>{</font>
<a name='L164'> <b>if</b> ((current->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->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 > 0)
<a name='L170'> <font color='red'>{</font>
<a name='L171'> <b>if</b> ((old_ruid == euid) || (current->euid == euid) || <a href='../S/34.html#L37' title='Defined at 37 in include/linux/kernel.h.'>suser</a> ())
<a name='L172'> current->euid = euid;
<a name='L173'> <b>else</b>
<a name='L174'> <font color='red'>{</font>
<a name='L175'> current->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->utime, (<b>unsigned</b> <b>long</b> *) &tbuf->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->stime, (<b>unsigned</b> <b>long</b> *) &tbuf->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->cutime, (<b>unsigned</b> <b>long</b> *) &tbuf->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->cstime, (<b>unsigned</b> <b>long</b> *) &tbuf->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 >= current->end_code && <i><font color='green'>// 如果参数>代码结尾,并且</font></i>
<a name='L225'> end_data_seg < current->start_stack - 16384) <i><font color='green'>// 小于堆栈-16KB,</font></i>
<a name='L226'> current->brk = end_data_seg; <i><font color='green'>// 则设置新数据段结尾值。</font></i>
<a name='L227'> <b>return</b> current->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->pid;
<a name='L250'> <b>if</b> (!pgid) <i><font color='green'>// 如果pgid 为0,则使用当前进程pid 作为pgid。</font></i>
<a name='L251'> pgid = current->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> < <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>] && task[<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>]->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>]->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>]->session != current->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>]->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->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->leader && !<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->leader = 1; <i><font color='green'>// 设置当前进程为新会话首领。</font></i>
<a name='L279'> current->session = current->pgrp = current->pid; <i><font color='green'>// 设置本进程session = pid。</font></i>
<a name='L280'> current-><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->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> < <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> *) &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 & 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->umask;
<a name='L307'>
<a name='L308'> current->umask = mask & 0777;
<a name='L309'> <b>return</b> (old);
<a name='L310'><font color='red'>}</font>
</pre>
<hr>
<a name='BOTTOM'>
<i><font color='green'>/* [<][>]<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 + -
显示快捷键?