欢迎来到军工软件开发人才培养基地——学到牛牛

Linux进程和守护进程

时间:2024-05-06 07:01:10 来源:学到牛牛

进程基本概念:

操作系统中有很多抽象出来的概念,进程就是其中之一。

进程定义:

一个执行中程序的实例,即一个正在执行的程序进程是Linux系统中一个十分重要的概念,每个进程运行时都会运行一段独立的程序,并且初始化的时候拥有一个独立控制的线程。

进程查看:

我们可以通过ps -ajx命令查看系统中的进程

解释:

1、用ps -ajx命令查看系统中的进程。参数a表示列出所有用户的进程;j表示表示列出与作业控制相关的进程。;参数x表示列出有控制终端的进程,无控制终端的进程

2、凡是TPGID一栏写着-1的都是没有控制终端的进程,也就是守护进程

3、守护进程采用以d结尾的名字,表示daemon。

进程的几种状态说明:

R:运行或将要运行

S:被阻断而等待一个事件,可能会被一个信号激活

D:被阻断等待另外一个事件,不会被信号激活

Z:僵死,但是它的父进程没有被调用wait函数

进程创建:

在Linux中我们可以通过fork来创建。父进程在 fork 后会得到子进程的 PID,即代表这个子进程的唯一标识符。如果子进程想要知道自己的 PID,可以调用getpid()方法。当子进程结束运行时,父进程会得到子进程的 PID,因为一个进程会 fork 很多子进程,子进程也会 fork 子进程,所以 PID 是非常重要的。我们把第一次调用 fork 后的进程称为原始进程,一个原始进程可以生成一颗进程树。

守护进程:

在某些用户空间中即使用户退出登录,任然有一些后台进程在运行,我们把这些进程称为守护进程

守护进程(deamon)是生存期长的一种进程。它们常常在系统引导装入时启动(如果需要守护进程随系统自启动,需要在/etc/init.d目录下放置响应的启动脚本,或者利用systemctl来控制,还有一些其他方法如supervisor等),仅在系统关闭时才终止。因为它们没有控制终端,所以说它们是在后台运行的。

源码:

1 #include<stdio.h>

  2 #include<stdlib.h>

  3 #include<unistd.h>

  4 #include<signal.h>

  5 #include<fcntl.h>

  6 #include<sys/stat.h>

  7 

  8 int mydaemon(void)

  9 {

 10 

 11         int fd;

 12         int pid;

 13         struct sigaction sa;

 14         //设置权限掩码

 15         umask(0);

 16         //创建子进程,关闭父进程

 17         pid = fork();

 18         if(pid < 0){

 19                 perror("fork error!\n");

 20                 exit(1);

 21         }else if(pid > 0){

 22                 exit(0);

 23         }

 24          //setsid后子进程不受终端影响,终端退出,不影响子进程

 25         setsid(); //创建一个会话

 26 

 27         sa.sa_handler = SIG_IGN;

 28         sa.sa_flags = 0;

 29         sigemptyset(&sa.sa_mask);

 30 

 31         if(sigaction(SIGCHLD, &sa, NULL) < 0){ //忽略信号

 32                 return -1;

 33         }

 34 

 35         if(chdir("/") < 0){//将当前工作目录更改为根目录

 36                 return -1;

 37         }

 38 

 39         //关闭不需要的文件描述符,或者重定向到/dev/null

 40         close(0);

 41         fd = open("/dev/null", O_RDWR);

 42         dup2(fd, 1);

 43         dup2(fd, 2);

 44 }

效果

Ps -ajx | grep ./a.out