您现在的位置是:首页 >技术交流 >Linux-0.11 kernel目录进程管理sys.c详解网站首页技术交流

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

程序员小x 2024-07-01 11:59:50
简介Linux-0.11 kernel目录进程管理sys.c详解

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;
		else
			return(-EPERM);
	}
	if (egid>0) {
		if ((current->gid == egid) ||
		    (current->egid == egid) ||
		    (current->sgid == egid) ||
		    suser())
			current->egid = egid;
		else
			return(-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;
    else
        return(-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

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。