您的位置:首页 > 运维架构 > Linux

Linux-获取进程管理

2016-04-15 13:47 489 查看
实验环境

VMware Workstation Pro下Linux Red Hat

内核版本:2.6.32

1.通过vim编写程序





首先程序需要包含所需要的头文件。sys/types.h数据结构pid_t在此构造、sys/wait.h函数wait在内定义、sys/time.h和sys/resource.h包含getpriority函数定义。

其中函数getpriority的函数原型定义如下:int getpriority(int witch, int who);

witch有三个可选项:PRIO_PROCESS、PRIO_PGRP、PRIO_USER分别表示进程、进程组、用户识别码。who为进程的pid号

使用fork()函数内核会返回两个返回值,若返回值为0,表示这是子进程;若返回值非零,表示是父进程,并且返回值是子进程的pid号。通过返回值得不同来区分父进程和子进程。

值得一提的是:在子进程的最后可以使用_Exit(0)来终结进程,该函数包含在头文件unistd.h中,它会调用do_exit()来进行清理工作。具体做了什么工作呢?

将task_struct标识为PF_EXITING

调用del_time_sync()删除内核定时器

调用_exit_mm()放弃mm_struct

调用exit_files(),_exit_fs(),exit_namespace(),exit_sighand()。分别为文件描述符,文件系统数据,命名空间,信号处理函数。

调用exit_notify()向父进程发信号,并为子进程寻找新的父亲,如果没有就找init做为子进程的父亲,然后将自己设为TASK_ZOMBLE(僵死状态)

最后调用schedule()进行进程调度。(ps.该函数在kernel/exit.c中)

其实除了使用_Exit(0)这种显式终止以外,系统还可以隐式的终止进程,即在main函数返回的时候去调用do_exit()函数。

另外该程序中还存在除了fork(),exit()之外的另一个系统调用,那就是wait()。它的作用将调用它的进程挂起(文中是将父进程挂起),然后等待其中一个进程退出,并返回该退出进程的pid号。

有兴趣的话可以试一下pid = wait(NULL);然后将pid输出,会发现这个数字和在子程序中调用getpid()获得的数字是一样的。

2.运行程序验证结果



程序让子进程和父进程分别以不同的速度进行数字输出,可以看出来子进程和父进程是一起执行的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息