Linux-获取进程管理

实验环境
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.运行程序验证结果
这里写图片描述

程序让子进程和父进程分别以不同的速度进行数字输出,可以看出来子进程和父进程是一起执行的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值