进程的调用

来源:互联网 发布:linux下查看当前用户 编辑:程序博客网 时间:2024/06/05 00:40

每个进程都有一个非负整数的唯一ID,用pid_t结构表示其ID,其中ID为0的是调度进程,常被称为交换进程。是内核的一部分为系统进程,ID为1的是init进程,他是一个普通用户进程,但用root权限运行。我们可以调用fork函数来分支产生子进程,子进程是父进程的副本,得到其数据空间,推和栈的副本。子进程会用dup函数复制父进程表项,从而实现文件共享,两进程维护同一张文件表项,返回给父进程的是子进程的ID,返回给子进程的是0,子进程可通过getppid得到父进程的ID;
vfork也可产生子进程,其产生的子进程并将父进程的地址空间全部复制到子进程中,在父进程的空间中运行,所以子进程进行调用函数,修改数据等操作都会产生不确定的结果。且其是保证子进程先运行,等他调用exec或exit时,父进程才开始被调度运行。
进程一共有5种正常退出方式与3种异常退出方式,不管进程如何终止,最后都会执行内核中的同一段代码,为相应进程关闭打开的描述符,释放其所用的储存器。因为父进程与子进程执行时间不同,可能父进程先结束,此时子进程的父进程会变成init,等子进程结束,init会调用wait自动保存它的相关信息,若子进程先结束,而父进程没提供相关处理函数wait,waitpid,则此子进程会成为僵死进程,占用系统内存。
wait与waitpid获得的整形常量包含了,子进程的退出状态,信号编号以及有个指示是否产生了core文件,可通过系统定义的宏来进行判断。waitid与waitpid相似但它提供了两个参数来表示要等待的子进程所属的类型。wait3,wait4则允许内核返回由终止进程及所有子进程的资源概况。如CPU时间总量,缺页次数等。
因为父进程与子进程的执行时间并不确定,有可能子进程先执行完,有可能父进程先执行完,可通过多个进程之间某种形式的信号发送与接受的方法,解决该问题。
exec函数可启动另一个程序,用一个磁盘上的新程序来替换当前进程的正文段,数据段,堆段与栈段。
setuid与setgid可设置实际用户ID与实际用户ID,若有root权限,则更改全部的实际用户ID,有效用户ID与保存的设置用户ID。若无,则只能更改有效ID变为uid。其中保存的设置ID可用于权限的该变,在需要提升特权时,可设置程序文件的设置用户ID而得到额外的权限。而不需要时,则返回实际用户的权限,使进程的权限控制更具灵活性。

0 0
原创粉丝点击