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.运行程序验证结果
程序让子进程和父进程分别以不同的速度进行数字输出,可以看出来子进程和父进程是一起执行的。
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.运行程序验证结果
程序让子进程和父进程分别以不同的速度进行数字输出,可以看出来子进程和父进程是一起执行的。
相关文章推荐
- Linux socket 初步
- Linux Kernel 4.0 RC5 发布!
- VIM编译器显示TAB和TAB转换为空格
- linux lsof详解
- linux 文件权限
- Linux 执行数学运算
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- 菜鸟说给菜鸟听之VIM--入门篇(1)
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户