进程控制 --chlaws

                    进程控制 --chlaws
在文章之前需要简单的了解下相关的函数和一些概念。若已经知道,觉的没有必要再看了,可以略过前面这部分。


1首先是关于一些隶属于进程控制这块的函数 做个简单的说明,若是还有不明白的就使用man命令来参看manual。
关于获得进程ID号和父进程ID的函数
getpid()/getppid()

关于获取实际用户和有效用户ID。
注意实际用户ID是指标识运行该进程的的用户,有效用户ID是指标识以什么用户身份来运行进程。
例子: user A:创建了一个文件,而这个程序以root身份来执行,这个文件执行时就具有了root权限。
此时实际用户ID就是A,有效用户ID就是root用户的ID
getuid()/geteuid()  ,

关于获取实际组ID和有效组ID
getgid()/getegid()
对应的有设置用户ID和组ID的函数
setuid(uid)/setgid(gid)

fork  创建一个新进程(完全复制父进程资源) //vfork 子进程规定是先执行,和父进程共享空间
exit 
exec 家族函数,用于执行一个新的应用程序,可以传递参数给新程序。具体的可以使用man 3 exec查看

wait/waitpid 挂起父进程,等待子进程终止

检查wait和waitpid所返回状态的几个宏
WIFEXITED(val) 子进程正常结束,该宏返回一个非零值,表示真。若异常结束,返回0,表示假
WEXITSTUS(val) 若WIFEXITED返回非零,它返回子进程中exit参数的低8位
WIFSIGNALED(val) 异常结束,返回非0表示真
WTERMSIG(val)    WIFSIGNALED返回非0,则该宏返回使子进程异常终止的信号编号
WIFSTOPPED(val)  子进程暂停,返回非0表示真
WSTOPSIG(val)    WIFSTOPPED返回非0,该宏返回使子进程暂停的信号编号

nice  改变进程优先级,其内部实现是通过调用getpriority/setpriority来实现的
实现函数:
int nice(int increment)
{
    int oldp = getpriority(PRIO_PROCESS,getpid());
    return setpriority(PRIO_PROCESS,getpid(),oldp+increment); 
}


2.一些基本的概念需要知道,具体的如下

程序转化为进程的步骤
1.内核将程序读入内存,为程序分配内存空间。
2.内核为该进程分配pid和PCB其他所需的资源
3. 内核为该进程保存pid及状态信息,把进程放到运行队列等待执行。
程序转化为进程后可以被操作系统的调度程序调度执行。


进程的状态(可以通过ps进行查看 如ps -ux 查看当前用户的进程状态)
R 运行状态
S  可中断等待状态
D  不可中断等待
Z  僵死状态
T  停止状态
<  高优先级进程
N   低优先级进程
L    内存锁页
s    会话首进程
l     多线程进程
+  进程位于前台进程组




创建守护进程的步骤:
1.忽略终端I/O信号,STOP信号
2.结束父进程,使子进程成为后台进程
3.使用setsid()建立一个新的进程组,在这个新的进程组中,子进程成为这个进程组的首进程,以使该进程脱离所有终端。
4.再次建立一个子进程,退出父进程,保证该进程不是进程组长,同时让该进程无法再次打开一个新的终端。
5.关闭所有从父进程继承下来的不再需要的文件描述符
6.改变工作目录,使得进程不与任何文件联系
7.将文件屏蔽字设置为0
8.忽略SIGCHILD信号

setsid  创建一个新对话期。常用于创建守护进程。控制终端,登录会话和进程组通常是从父进程继承下来的,守护进程要摆脱他们,不受影响,其方法是调用setsid使进程成为一个会话组长。


3.具体代码实例

//note:守护进程的代码


//note:myshell的实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值