Linux 下进程基础知识说明

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+,因为这表示这个进行已经运行完成。但是资源还未回收,这就是所谓的僵尸进程。

了解了进行的一些概念后。我们需要知道,在服务端开发时经常使用的一种进程,我们称它为守护进程。守护进程一般都是为了将服务器程序后台化,编写守护进程遵循一定的步骤:

守护进程编写规则:

  1. 设置umask(0) 取消mask对文件权限的影响
  2. Fork 一个子进程。然后父进程退出(为了解决让终端空闲出来),子进程调用setsid() 让子进程脱离当前进程组成为新的进程组,组长。
  3. 一切接文件。任何一个进程启动后都会打开3个特定的文件描述符。0,1,2。
  4. 守护进程为了脱离这三个进程。那么需要进行输出重定向。使用函数时dup2(fd,STDIN_FILENO) ,

注:Dup2 函数的最直接的理解是:将fd所指向的地方,让后面的 STDIN_FILENO也指向它。使用这个函数后那么 STDIN_FILENO 也同样指向了 fd 所指向的文件描述符。

守护进程demo下次补充吧。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值