ps 命令一般使用的参数 格式如下 ps -eo pid,ppid,sid,tty,pgrp,comm|grep -E 'bash|a.out' 。用管道符和grep 配合使用提取我们需要的信息。如本例子中 就是筛选出bash 和a.out 关键字的信息。
进程是程序运行的实例,当编译好的程序,由操作系统加载到内存中通过main 接口函数(程序的入口函数,这个约定为系统调用的入口)调用后运行起来,就称为进程。如在本机的测试例子筛选如下图
进程组:具有进程组ID的进程称为进程组。一般来说是使用fork或者vfork系统调用创建的进程。比如我们打开的bash 终端就是,在终端上执行多个可运行程序。当关闭窗口时。会向 session leader 发送一个SIGHUP 信号。Session leader 收到这个信号会向进程组的所有信号发送这个sighup 信号,这个信号的默认处理方式时中断。
为什么要引入信号?其实就是解决多个进程间进行消息的通信。由于进程与进程间是独立使用虚拟地址空间,进程间通信就引入了信号,在Linux 平台下信号查看命令使用 kill -l 查看系统支持的哪些信号编号。我们需要注意的是哪些信号是可靠、不可靠。信号哪些可以屏蔽,哪些是不可以屏蔽。在了解信号相关知识前,我们需要掌握的是信号的几种处理方式:
1、信号缺省动作(系统默认动作)一般是杀死 2、信号忽略(什么也不做)。3、信号捕捉(自己来写函数来处理,缺省动作将被忽略) 。注:9 和 19 编号的信号是不能做任何的处理。
Kill -l 查看信号列表
列表中,编号为1 ~ 31的信号为传统UNIX支持的信号,是不可靠信号(非实时的),编号为32 ~ 63的信号是后来扩充的,称做可靠信号(实时信号)。不可靠信号和可靠信号的区别在于前者不支持排队,可能会造成信号丢失,而后者不会。
SIGKILL(9) SIGSTOP 这两个信号是无法进行屏蔽的。
在了解了信号后。我们可以使用系统调用函数:Signal (不建议用)和 Sigaction(推荐使用)来自定义信号处理函数。每一个进程都有一个信号集:使用信号集函数可以对信号进行操作。当 信号集中对应的信号位置为1 表示对该信号的阻塞。当前进程中对所有的设置为的信号都不能进行处理。Sigcmask 把信号集和当前进程进行绑定 不绑定无法使用信号集来控制信号。
1-32 不可靠信号。多次发送一次处理。32 -64 可靠信号。发送几次处理几次。我们在测试中可以使用 kill 命令向指定的进程发送一个信号。如下图
在这个例子中我们可以看到进程的状态有:Ss、Ss+、S+、Z+ 等。其中需要关注的Z+,因为这表示这个进行已经运行完成。但是资源还未回收,这就是所谓的僵尸进程。
了解了进行的一些概念后。我们需要知道,在服务端开发时经常使用的一种进程,我们称它为守护进程。守护进程一般都是为了将服务器程序后台化,编写守护进程遵循一定的步骤:
守护进程编写规则:
- 设置umask(0) 取消mask对文件权限的影响
- Fork 一个子进程。然后父进程退出(为了解决让终端空闲出来),子进程调用setsid() 让子进程脱离当前进程组成为新的进程组,组长。
- 一切接文件。任何一个进程启动后都会打开3个特定的文件描述符。0,1,2。
- 守护进程为了脱离这三个进程。那么需要进行输出重定向。使用函数时dup2(fd,STDIN_FILENO) ,
注:Dup2 函数的最直接的理解是:将fd所指向的地方,让后面的 STDIN_FILENO也指向它。使用这个函数后那么 STDIN_FILENO 也同样指向了 fd 所指向的文件描述符。
守护进程demo下次补充吧。