Linux-0.11 kernel目录进程管理sys.c详解

news/2024/11/27 1:25:29/

Linux-0.11 kernel目录进程管理sys.c详解

模块简介

在sys.c模块中,有很多关于进程id、进程组id、用户id、用户组id的系统调用。 另外在该文件,诸如sys_ftime,sys_break等函数在Linux-0.11版本中尚未实现。

函数详解

sys_ftime

int sys_ftime()

未实现。

sys_break

int sys_break()

未实现。

sys_ptrace

int sys_ptrace()

用于当前进程对子进程进行调试。

sys_stty

int sys_stty()

改变并打印终端设置。

未实现。

sys_gtty

int sys_gtty()

获取进程终端信息。

未实现。

sys_rename

int sys_rename()

修改文件名。

未实现。

sys_prof

int sys_prof()

未实现。

sys_setregid

int sys_setregid(int rgid, int egid)

该函数用于设置进程的实际组id或者有效组id。

	if (rgid>0) {if ((current->gid == rgid) || suser())current->gid = rgid;elsereturn(-EPERM);}if (egid>0) {if ((current->gid == egid) ||(current->egid == egid) ||(current->sgid == egid) ||suser())current->egid = egid;elsereturn(-EPERM);}return 0;

sys_setgid

int sys_setgid(int gid)

该函数用于设置进程组号。

return(sys_setregid(gid, gid));

sys_acct

int sys_acct()

未实现。

sys_phys

int sys_phys()

未实现。

sys_lock

int sys_lock()

未实现。

sys_mpx

int sys_mpx()

未实现。

sys_ulimit

int sys_ulimit()

未实现。

sys_time

int sys_time(long * tloc)

返回从1970年1月1日 00:00:00开始到此刻的秒数。

int i;i = CURRENT_TIME;
if (tloc) {verify_area(tloc,4);put_fs_long(i,(unsigned long *)tloc);
}
return i;

sys_setreuid

int sys_setreuid(int ruid, int euid)

该函数的作用是设置实际用户id(ruid)和有效用户id(euid)。

int old_ruid = current->uid;if (ruid>0) {if ((current->euid==ruid) ||(old_ruid == ruid) ||suser())current->uid = ruid;elsereturn(-EPERM);
}
if (euid>0) {if ((old_ruid == euid) ||(current->euid == euid) ||suser())current->euid = euid;else {current->uid = old_ruid;return(-EPERM);}
}
return 0;

sys_setuid

int sys_setuid()

该函数用设置任务uid。其内部调用sys_setreuid函数实现。

return(sys_setreuid(uid, uid));

sys_stime

int sys_stime()

该函数的作用是获取开机时间的秒数。

if (!suser())return -EPERM;
startup_time = get_fs_long((unsigned long *)tptr) - jiffies/HZ;
return 0;

sys_times

int sys_times(struct tms * tbuf)

该函数的作用是获取当前进程的时间统计值。

其通过put_fs_long将pcb中和时间相关的数据拷贝到tbuf中。utime代表用户态运行时间,stime代表内核态运行时间,cutime代表子进程用户运行时间,cstime代表子进程内核态运行时间。

if (tbuf) {verify_area(tbuf,sizeof *tbuf);put_fs_long(current->utime,(unsigned long *)&tbuf->tms_utime);put_fs_long(current->stime,(unsigned long *)&tbuf->tms_stime);put_fs_long(current->cutime,(unsigned long *)&tbuf->tms_cutime);put_fs_long(current->cstime,(unsigned long *)&tbuf->tms_cstime);
}
return jiffies;

sys_brk

int sys_brk(unsigned long end_data_seg)

该函数的作用用于设置堆区的指针brk的值。

if (end_data_seg >= current->end_code &&end_data_seg < current->start_stack - 16384)current->brk = end_data_seg;
return current->brk;

sys_setpgid

int sys_setpgid(int pid, int pgid)

该函数的作用是将进程号等于pid的进程的组号设置为pgid。

int i;if (!pid)pid = current->pid;
if (!pgid)pgid = current->pid;
for (i=0 ; i<NR_TASKS ; i++)if (task[i] && task[i]->pid==pid) {if (task[i]->leader)//如果不是会话leader,则没有权限return -EPERM;if (task[i]->session != current->session)//必须要属于同一个会话return -EPERM;task[i]->pgrp = pgid;return 0;}
return -ESRCH;

sys_getpgrp

int sys_getpgrp(void)

该函数用于返回当前进程的进程组号。

return current->pgrp;

sys_setsid

int sys_setsid(void)

该函数用于创建一个session,并设置进程为会话首领。

if (current->leader && !suser())//该进程已经是leader,但是不是超级用户,则返回-EPERM。return -EPERM;
current->leader = 1;//设置leader = 1
current->session = current->pgrp = current->pid;//设置进程会话号
current->tty = -1;//设置进程没有控制中断
return current->pgrp;

sys_uname

int sys_uname(struct utsname * name)

该函数用于获取系统名称等信息。

static struct utsname thisname = {"linux .0","nodename","release ","version ","machine "
};
int i;if (!name) return -ERROR;
verify_area(name,sizeof *name);
for(i=0;i<sizeof *name;i++)put_fs_byte(((char *) &thisname)[i],i+(char *) name);
return 0;

sys_umask

int sys_umask(int mask)

设置当前进程创建文件的属性屏蔽码为(mask & 0777)

0777代表数字是一个八进制数字,即000111111111。

int old = current->umask;current->umask = mask & 0777;
return (old);

Q & A


http://www.ppmy.cn/news/97340.html

相关文章

如何在华为OD机试中获得满分?Java实现【猜字谜】一文详解!

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: Java华为OD机试真题&#xff08;2022&2023) 文章目录 1、题目描述2、输入描述3、输出描述…

C++ 入门导引(这是一篇由GPT4写的文章)

C 应用场景 C 是一种广泛应用的编程语言&#xff0c;拥有多种使用场景。以下是 C 的一些主要应用场景&#xff1a; ​1. 游戏开发&#xff1a;C 常用于游戏开发&#xff0c;尤其是大型 3D 游戏。它可以轻松地与图形 API&#xff08;如 OpenGL 和 DirectX&#xff09;集成&…

SpringBoot项目中controller层、service层、mapper层、entity层、dto层、vo层理解

SpringBoot框架继承了Spring中基本功能&#xff0c;但在项目层级结构上又有些不同&#xff0c;本文着重对SpringBoot项目中后端的基本层级结构做了梳理。 项目的具体开发规范建议学习Java开发手册&#xff08;嵩山版&#xff09;&#xff0c;本文不作一一赘述。 Controller层…

[java]两数之和 II - 输入有序数组

两数之和 II - 输入有序数组 leetcode 167 原题链接解题思路解题代码排序专题 leetcode 167 原题链接 167. 两数之和 II - 输入有序数组 – 原题链接 题目描述: 给你一个下标从 1 开始的整数数组 numbers &#xff0c;该数组已按 非递减顺序排列 &#xff0c;请你从数组中找出…

【String——简单使用】

文章目录 String1. 字符串定义和初始化2. 字符串基本操作2.1 访问单个字符2.2 修改字符串内容2.3 字符串查找和比较 3. 常用字符串函数3.1 length() 和 size()3.2 empty()3.3 substr()3.4 c_str() 4.字符与整形之间相互转换4.1 char 类型转 int 类型4.2 int 类型转 char 类型4.…

Mysql函数大全

前言 MySQL提供了众多功能强大、方便易用的函数&#xff0c;使用这些函数&#xff0c;可以极大地提高用户对于数据库的管理效率&#xff0c;从而更加灵活地满足不同用户的需求。本文将MySQL的函数分类并汇总&#xff0c;以便以后用到的时候可以随时查看。 数学函数 &#xf…

随机数发生器设计(二)

一、软件随机数发生器组成概述 密码产品应至少包含一个随机比特生成器。 软件随机数发生器应遵循GM/T 0105-2021《软件随机数发生器设计指南》要求&#xff0c;使用SM3或SM4算法作为生成随机比特算法。 本文以SM3算法为例描述软件随机数发生器的一个设计实例。需要注意的是&a…

SpringCloud Alibaba Sentinel

SpringCloud Alibaba Sentinel Sentinel 基础 官网 1 Github: https://github.com/alibaba/Sentinel 2 快速开始: https://sentinelguard.io/zh-cn/docs/quick-start.html 3 中文: https://github.com/alibaba/Sentinel/wiki/介绍 4 使用手册: https://spring-cloud-alib…