Linux进程和守护进程
进程基本概念:
操作系统中有很多抽象出来的概念,进程就是其中之一。
进程定义:
一个执行中程序的实例,即一个正在执行的程序进程是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