Unix 进程回顾

1.1 mian函数的调用

(1)编译链接时的引导代码,操作系统下的应用程序在 main 函数执行前,其实也需要先执行 一段引导代码,才能去执行 main, 我们写应用程序时,不用考虑引导代码的问题,编译和连接时,(准确说是链接时)由链接器将编译器中 事先准备好的引导代码 链接进去 和 我们的应用程序一起,构成最终的可执行程序。
(2)运行时的加载器: 加载器是操作系统中的程序,当我们去执行一个程序时,比如说 ./a.out 并且其代码中,使用 exec 族 函数运行,加载器会将这个程序加载到内存中去执行
(3)程序在编译链接时, 使用 链接器,在运行时 使用 加载器 ,
(4)argc 与 argv 这是 main 函数中的两个参数,我们在 linux 下,在命令行中 传入这两个参数的过程,本身其实是 将这两个参数传给了 shell 进程,shell 进行,去运行加载器,将这两个参数 传递给加载器,而后,加载器 又 去链接 引导程序,当引导程序执行完毕时,才会将这两个参数传递给 main 进程。

1.2 程序的结束

(1)正常结束: return , exit , _exit
return -1 ,等,对 作者而言,是作为一种错误结束的标记,但是对操作系统而言,显然是一种正确的结束方式,
(2) 非正常结束: 自己或他人发 信号 终止进程,比如说,Ctrl C 就是一种典型的 使用 信号,终止进程的方式, Ctrl C 是一种默认的终止进程的信号,但是我们也设置,不使用 Ctrl C 终止

1.3 注册进程终止处理函数 atexit

当程序一旦运行结束,可以使用 atexit

使用 man 手册 查阅 atexit 函数:
NAME
atexit - register a function to be called at normal process termination
SYNOPSIS
#include <stdlib.h>
int atexit(void (*function)(void));
DESCRIPTION …
RETURN VALUE
The atexit() function returns the value 0 if successful; otherwise it returns a nonzero value.

int atexit(void (*function)(void));
直白点呢,就是说,这个 函数,传入一个函数的地址,然后,当异常结束时,便执行此函数。

我们来写一串函数,感受一下

#include<stdio.h>
#include <stdlib.h>
void funct1(){
        printf("中途跑路\n");
}
void funct2(){
        printf("提桶跑路\n");
}
int main(){
        printf("qq i\n");
        atexit(funct1);
        atexit(funct2);
        printf("weixin i\n");
        return 0;
}

运行代码:
ksbgt8vu.png
先 执行 main 函数中正常函数,而后,先执行 最新的被注册的 进程终止处理函数,提桶跑路,而后才是 之后的注册进程终止处理函数,中途跑路

atexit() 注册的进程终止处理函数,会以 栈 的形式存放! 先进后出

return 与 exit 与 _exit

分别使用不同的方式退出,在这里 return , exit() 现象相同,但是 _exit() 不会执行,
对于 _exit 他在终止进程之后,不会执行其余的清理工作。

1.4 进程组,会话组

进程组

在兼容于 POSIX 标准的操作系统中,进程组(英语:Process group,又译过程组群)是指一个或多个进程的集合。进程组被使用于控制信号的分配。对于一个进程组发出的的信号,会被个别递送到这个组群下的每个进程成员中。

会话组

进程组本身,也可以被集合成一个组群来管理,称为会话组(sessions)。归属于某个特定会话组下的进程组,不能移动到别的会话组下;在某个进程组下的特定进程,在创造出新的进程时,这个进程也只能属于这个父进程所归属的相同会话组。

1.5 进程查看命令

(1) ps -aux 偏向于显示进程的占用资源
ksbirepg.png
USER: 行程拥有者
PID: pid, 当前进程的 ID 号
%CPU: 占用的 CPU 使用率
%MEM: 占用的记忆体使用率
VSZ: 占用的虚拟记忆体大小
RSS: 占用的记忆体大小
TTY: 终端的次要装置号码 (minor device number of tty)
STAT: 该行程的状态:
START: 行程开始时间
TIME: 执行的时间
COMMAND:所执行的指令

(2) ps -ajx 偏向于显示各种 ID 号

ksbirwmr.png
PPID: 进程 的 父进程号
PID: 当前进程 的 进程号
PGID: 父进程的组 ID 号
SID: 会话组有关

1.6 杀死进程 kill

kill -信号编号 进程ID

向进程发送一个信号,

kill -9 xxx

一个常用的,杀死进程的命令,向 进程 xxx 发送 信号 9

1.7 什么是守护进程:

(1) 守护进程:daemon (n. 守护进程,后台程序) 简称为 d ,进程名称后方带 d 的,大多为守护进程
(2) 长期运行(一般是从开机运行,直至关机 关闭)
(3) 与控制台脱离
大多数,程序都是与控制台相邦定的,也就是说,如果终端被强制性关闭了,那么这个终端中的所有进程,往往也被全部关闭,因为一个终端中的进程,往往属于一个 会话,当次会话被关闭时,进程终止。
比如说 man daemon 进入 man 这个终端,而后 ps -aux 有:
ksbnmlle.png
而后我们,直接 x 掉终端 man daemon 的进程就会直接消失,被关闭。
这里的 TTY : pts/0 就是 man 进程所在的终端。

而 TTY : ? 就是说,这些进程,不依赖于任何终端,与控制台分离,也就是说,他们是
守护进程 !!!

(4)服务器(Server),服务器程序一般都是一个一直在运行的程序,可以为我们提供某种服务,当我们需要这种服务时,我们便可以和服务器程序通信,以获得服务器程序的服务。 因为服务器的特性,所以一般的服务器程序都实现为 守护进程。

常见守护进程:

< syslogd > 日志守护进程,提供 syslog 功能
< cron > 用于实现时间管理,比如说 在 linux 中实现定时执行程序,可以调用此进程
ksbo6xst.png

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值