进程的管理
一、进程的基础
进程和程序的区别
每个进程有自己的pid、PCB
操作系统上运行的所有进程构成一颗树。
如何查看这颗树?
pstree()
树根进程是init pid是 进程间的亲缘关系两种 父子关系 兄弟关系 使用top()命令观察进程的状态
使用ps()命令也可以查看进程。 二、进程的创建
父进程创建子进程 父进程如何去创建子进程?
父进程调用fork(),创建新的子进程。
#include <unistd.h>
pid_t fork(void);
功能:创建一个子进程
参数:
void:
返回值:
在父进程中 - 错误 errno被设置
成功 在父进程中 子进程的pid被返回
在子进程中 被返回 写时复制技术 举例说明 使用fork(),创建新的子进程
代码参见 fork.c 三、进程的退出
、注意return和exit()的区别
return只是从函数返回。结束函数的生命周期。
exit()结束进程的生命周期 exit()
#include <stdlib.h>
void exit(int status);
功能:使进程正常终止
参数:
status:指定进程的退出状态码。
返回值:
返回这个值 status & 0377给父进程
举例说明 exit()的使用
代码参见 exit.c 目前,在bash下执行的程序,这个进程的父进程是bash。 、可以使用atexit()或者on_exit()向进程注册函数,在进程退出的时候调用这写注册的函数。
从main函数中返回的时候,进程结束了吗?
进程没有结束。 atexit()
#include <stdlib.h>
int atexit(void (*function)(void));
功能:向进程注册函数,在进程退出的时候被调用
参数:
function:指定遗言函数 返回值:
成功
非0 失败 注意:
、同一个函数注册一次就被调用一次,注册多次就被调用多次。
、函数注册的顺序和调用的顺序相反
、注册的遗言函数被子进程继承 void (*function)(void) 举例说明 使用atexit向进程注册遗言函数
代码参见 atexit.c on_exit()
#include <stdlib.h>
int on_exit(void (*function)(int , void *), void *arg);
功能:注册一个函数在进程终止的时候被调用
参数:
function:指定了遗言函数的名字
arg:指定了function函数的第二个参数,function的第一个参数是exit() 的退出状态码。 返回值:
成功
非0 失败 void (*function)(int , void *) 举例说明 使用on_exit()注册遗言函数
代码参见 on_exit.c _exit() 父进程创建子进程,然后父进程马上退出,子进程还没有终止的情况下,子进程过继给init进程。这些子进程被称为孤儿进程。 演示孤儿进程的现象
代码参见alone.c 四、进程资源的回收
在进程终止的时候,会向父进程发送SIGCHLD信号,父进程收到这个信号以后,调用wait()家族的函数,去回收子进程的资源。 在父进程还没有回收子进程的资源的时候,这时候,子进程处于僵尸状态。这时候的子进程称为僵尸进程。 举例说明僵尸进程 代码参见zomble.c wait()
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);
功能:等待进程状态的改变
参数:
status:如果不为空,存储子进程的信息。
这个整数可以使用宏来检测。
WIFEXITED(status) 如果子进程正常终止,返回true。
WEXITSTATUS(status) 返回子进程的退出状态码。只有在上边的宏返回真的时候,被使用
WIFSIGNALED(status) 如果子进程被信号终止,那么返回true
WTERMSIG(status) 只有在上边的宏为真的情况下使用。返回的是使子进程终止的信号编号。 返回值:
- 错误
返回终止的子进程的pid。 举例说明 使用wait()回收子进程的资源。
代码参见 wait.c 补充:
如何给进程发送信号,终止进程?
kill -信号编号 pid 信号编号 pid_t waitpid(pid_t pid, int *status, int options);
功能:等待子进程状态的改变
参数:
pid:指定了要等待的子进程的pid。
<-: 等待任意子进程,子进程的组id等于pid的绝对值。
-:等待任意子进程
:等待任意子进程,这写子进程的组id等于当前进程组id。
>:pid指定了要等待的子进程pid。 status:如果不为空,存储子进程的信息。
options:可以改变是否等待子进程的终止。
WNOHANG:如果没有子进程退出,立即返回。
如果没有子进程退出,阻塞等待子进程退出。 返回值:
成功 返回子进程的pid
错误 -
如果WNOHANG被指定 。 代表等待的所有子进程都没有终止。 wait(&s)===waitpid(-,&s,)
进程组中有1个或更多个进程。一般情况下子进程和父进程属于同进程组。 总结:
一、进程的基础
pstree ps top
二、进程的创建 fork() 三、进程的退出
exit _exit atexit on_exit
孤儿进程 四、回收子进程的资源 wait waitpid 僵尸进程

进程(day09)的更多相关文章

  1. Python异常处理和进程线程-day09

    写在前面 上课第九天,打卡: 最坏的结果,不过是大器晚成: 一.异常处理 - 1.语法错误导致的异常 - 这种错误,根本过不了python解释器的语法检测,必须在程序运行前就修正: - 2.逻辑上的异 ...

  2. python自动化开发-[第九天]-异常处理、进程

    今日概要: 1.异常处理使用 2.进程 3.paramiko模块使用 一.异常处理 1.常见的错误异常 #错误异常一 print(a) #NameError #错误异常二 int('sdadsds') ...

  3. Python之路【第十一篇】: 进程与线程

    阅读目录 一. cpython并发编程之多进程1.1 multiprocessing模块介绍1.2 Process类的介绍1.3 Process类的使用1.4 进程间通信(IPC)方式一:队列1.5 ...

  4. python开发学习-day09(队列、多路IO阻塞、堡垒机模块、mysql操作模块)

    s12-20160312-day09 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...

  5. day09搭建均衡负载和搭建BBS博客系统

    day09搭建均衡负载和搭建BBS博客系统 搭建BBS博客系统 本次搭建bbs用到的技术 需要用到的: 1.Nginx+Django 2.Django+MySQL 环境准备 主机 IP 身份 db01 ...

  6. 故障重现, JAVA进程内存不够时突然挂掉模拟

    背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下: # Set larger code cache with -XX:ReservedCodeCacheSize= # This ...

  7. 死磕内存篇 --- JAVA进程和linux内存间的大小关系

    运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...

  8. 使用Monit监控本地进程

    目前用它监控某些服务,失败自动重启,同时监控特定的日志文件,如果有变化,就发邮件报警 安装不细写了,网上好多 我先用cat /proc/version看了下我的系统是el6的,于是wget http: ...

  9. [APUE]进程控制(上)

    一.进程标识 进程ID 0是调度进程,常常被称为交换进程(swapper).该进程并不执行任何磁盘上的程序--它是内核的一部分,因此也被称为系统进程.进程ID 1是init进程,在自举(bootstr ...

随机推荐

  1. HDU 5434

    其实是一道状态DP题.都是行与行之间的转移,可以知道,当某j列中有一个象,如果存在情况i-1行j-1列有象而i,j-1位置无象则不可放,或者i-1,j+1有而i,j+1无同样不可放. 使用快速状态转移 ...

  2. iOS开发一行代码系列:一行搞定数据库

    原理 iOS 和 SQL的相应关系 Model类结构      =>    SQL表结构 Model实例       =>  SQL表中的一行 Model实例的属性   =>   S ...

  3. 小米红米1S 电信/联通版 专用TWRP2.8.1.1中文版 (全屏触摸/支持MTP挂载内外置存储)

    转载请注明出处和链接: http://blog.csdn.net/syhost/article/details/39340477 说说中文TWRP的简史:          中文TWRP是本人在201 ...

  4. Java判断是否为移动端

    以下为常用判断,可直接创建使用 /** * Created by kangao on 2018/3/23. */public class UAgentInfoHelper { // User-Agen ...

  5. 线段树 hdu3255 Farming

    做了这么多扫描线的题,,基本都是一个思路. 改来改去,,无非就是维护的节点的内容以及push_up越写越复杂了而已 首先将价格排序处理一下编号,变成编号越大的powerfol越大 然后后面加入扫描线的 ...

  6. HDU 5289 Assignment (ST算法区间最值+二分)

    题目链接:pid=5289">http://acm.hdu.edu.cn/showproblem.php?pid=5289 题面: Assignment Time Limit: 400 ...

  7. (转)dp动态规划分类详解

    dp动态规划分类详解 转自:http://blog.csdn.NET/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间 ...

  8. C#上移,下移TreeView中的树节点顺序

    C#上移,下移TreeView中的树节点顺序 2009-08-12 20:10 1494人阅读 评论(2) 收藏 举报 c#buttonobjectnullstring C#中,通过单击上移,下移按钮 ...

  9. 83.个人信息维护页面 Extjs 页面

    1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8" ...

  10. 3-5 第三天 Koa 和 Express 中间件

    Koa和Express这两个框架除了在接收请求和返回数据方面有非常通用.好用的封装以外,最有价值的地方就是它们有自己的中间件机制,所以说中间件可以看做是流水线上一个又一个的加工房间,每个加工的房间都只 ...