守护进程(Daemon)

Daemon(精灵)进程,是linux中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的时间。一般采用以d结尾的名字。从下面的进程信息可以看出,守护进程都是【?】。

colord 1160 0.0 0.2 399424 14520 ? Ssl 6月06 0:00 /usr/lib/colord/colord

Linux后台的一些系统服务进程,没有控制终端,不能直接和用户交互。不受用户登录,注销的影响,一直在运作着,他们都是守护进程。如ftp服务器;nfs服务器等。

创建守护进程,最关键的一步是调用setsid函数创建一个新的会话(session),并成为session leader。

会话和进程组

会话比进程组更高一级,多个进程组对应一个会话。

多个进程在同一个进出组,第一个进程是进程组的组长。

组长(父进程)不可以创建会话,必须是组员(子进程)创建。

创建会话(session)

1,创建会话的进程不能是组长进程(父进程)

2,创建会话成功的进程,变成组长进程(父进程)

3,新会话的进程丢弃原来的终端控制

4,建立新会话时,先调用fork,终止父进程,子进程调用创建会话的函数setsid

#include

#include

pid_t setsid(void);

DESCRIPTION

setsid() creates a new session if the calling process is not a process

group leader. The calling process is the leader of the new session

(i.e., its session ID is made the same as its process ID). The calling

process also becomes the process group leader of a new process group in

the session (i.e., its process group ID is made the same as its process

ID).

The calling process will be the only process in the new process group

and in the new session.

普通的进程为什么不是守护进程?因为,普通的进程在终端执行,当关闭终端时,终端会给这个终端里执行的所有进程发送信号SIGHUP,这个信号的默认处理的中断进程。所以,当终端被关闭时,所以的进程都被终止了,不能成为守护进程。

Signal Value Action Comment

──────────────────────────────────────────────────────────────────────

SIGHUP 1 Term Hangup detected on controlling terminal

or death of controlling process

创建守护进程的步骤:

1,创建子进程,终止父进程

2,在子进程中调用函数setsid,来创建新会话

3,改变当前进程的目录。chdir函数

4,重新设置文件权限的掩码。umask函数

5,关闭0,1,2文件描述符。守护进程用不到0,1,2文件描述符。避免浪费资源。

6,开始执行守护进程的核心代码。

7,推出守护进程,一般执行不到这里,因为一直在循环里。

例子:每分钟做一个文件

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define _FILE_ "%s/log/data_%ld"

void catc(int num){

char* host = getenv("HOME");

char buf[256] = {0};

sprintf(buf, _FILE_, host, time(NULL));

int fd = open(buf, O_WRONLY|O_CREAT, 0664);

if(fd < 0){

perror("open:");

exit(1);

}

close(fd);

}

int main(){

//创建子进程

pid_t pid = fork();

//关闭父进程

if(pid > 0){

exit(0);

}

//创建新会话

setsid();

//设置掩码

umask(0);

//改变工作目录

chdir(getenv("HOME"));

//关闭文件描述符

close(0),close(1),close(2);

//设置定时器

struct itimerval it = {{60, 0}, {1, 0}};

setitimer(ITIMER_REAL, &it, NULL);

//捕捉信号SIGALRM

struct sigaction act;

act.sa_flags = 0;

sigemptyset(&act.sa_mask);

act.sa_handler = catc;

sigaction(SIGALRM, &act, NULL);

while(1)

sleep(1);

}

守护进程扩展了解

普通的进程也能强行变成守护进程。使用命令【nohup】。

它的作用是,阻塞信号SIGHUP,也就是当终端被关闭时,信号SIGHUP被阻塞了,所以进程就没有被终止。

nohup ./a.out >> a.log &

命令解释:

./a.out:要执行的程序

把输出重定向到a.log

&:后台执行的意思

标签:process,创建,session,linux,进程,include,守护

来源: https://www.cnblogs.com/xiaoshiwang/p/10988899.html

linux 创建精灵进程,linux 进程通信之 守护进程相关推荐

  1. linux系统编程之进程(八):守护进程详解及创建,daemon()使用

    linux系统编程之进程(八):守护进程详解及创建,daemon()使用 一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等 ...

  2. Linux:守护进程解析、如何实现守护进程

    1.守护进程: 守护进程也称精灵进程(Daemon),是运行在后台的⼀一种特殊进程.它独立于控制终端且周期性地执行某种任务或等待处理某些发生的事件.守护进程是⼀一种很有用的进程.Linux的大多数服务 ...

  3. 2进程之间的关系:进程组,会话,守护进程

     1进程组 一个或多个进程的集合,进程组ID是一个正整数.用来获得当前进程组ID的函数. pid_t getpgid(pid_t pid) pid_t getpgrp(void) 获得父子进程进程 ...

  4. linux进程--进程组、会话、守护进程(八)

    进程组 一个或多个进程的集合 进程组ID: 正整数 两个函数 getpgid(0)=getpgrp() 例子:显示子进程与父进程的进程组id #include <stdio.h> #inc ...

  5. linux中daemonize用法,daemonize Unix系统后台守护进程管理软件

    在我们的工作中,很多时候都需要在linux中后台运行程序, 方法1: nohup & 方法2: daemonize Unix系统后台守护进程管理软件 优点:更加正规 后台运⾏更稳定 git c ...

  6. 实验2linux进程控制与通信,实验2 进程控制与通信管理word文档良心出品

    <实验2 进程控制与通信管理word文档良心出品>由会员分享,可在线阅读,更多相关<实验2 进程控制与通信管理word文档良心出品(13页珍藏版)>请在人人文库网上搜索. 1. ...

  7. linux创建定时任务命令,linux下添加定时任务

    linux下添加定时任务 linux下添加定时任务 ### linux下定时执行任务的方法 在LINUX中你应该先输入crontab -e,然后就会有个vi编辑界面,再输入0 3 * * 1 /cle ...

  8. php守护进程热更新,服务器编程--守护进程

    守护(Daemon)进程又叫作"精灵进程",虽然守护进程这个名字更为常用,但是个人感觉还是精灵进程较为机灵可爱些.服务器进程一般都是守护进程,这类进程的一个显著特点就是无交互地在后 ...

  9. linux自动重启保护,Linux在崩溃时自动重启应用程序 – 守护进程

    我有一个运行嵌入式 Linux的系统,它连续运行至关重要.基本上,它是一个与传感器通信并将数据中继到数据库和Web客户端的过程. 如果发生崩溃,如何自动重启应用程序? 此外,有几个线程正在进行轮询(例 ...

最新文章

  1. 山西对口升学计算机分数线,2020年山西对口升学本科一批录取分数线是多少
  2. 用初次训练的SVM+HOG分类器在负样本原图上检测HardExample
  3. 艾伟:详解AJAX核心 —— XMLHttpRequest 对象 (下)
  4. # JavaScript中的执行上下文和队列(栈)的关系?
  5. python批量修改word特定位置的内容_利用python批量修改word文件名的方法示例
  6. [图神经网络] 图节点Node表示---GCN
  7. Elementary OS安装Chrome
  8. flux storm_Apache Storm:如何使用Flux配置KafkaBolt
  9. getobject java,Object get(Object obj)
  10. 使用JAX-WS构建Web Services .
  11. dda算法c语言,Python使用DDA算法和中点Bresenham算法画直线
  12. 使用jemalloc优化java_C++性能优化(十) —— JeMalloc
  13. [OpenHarmony] [RK2206] 构建OpenHarmony编译器 (二)
  14. fresco 显示缩略图,不直接使用setImageURI,防止卡顿和显示不全:纯黑色或纯白色
  15. 【NLP】语法、文法、句法、词法概念的区别
  16. 清理Maven仓库冗余文件(lastUpdated、m2e-lastUpdated.properties、空文件夹)脚本
  17. HDFS、Ceph文件系统以及Hbase、Cassendra、TiDB比较
  18. OKCoin期货现货API[Python3版]
  19. JDK下载安装及环境变量配置指南(Window系统)
  20. 如何查Unity3D编辑器崩溃原因

热门文章

  1. [转]sql,N/$/#/@的含义和作用
  2. BoooLee pyretoolkit -- 一个基于python re模块的在线正则表达式测试工具
  3. python三维数据图_matplotlib中三维数据的热图
  4. linux 文件的目录,Linux文件及目录管理
  5. 请先设置tkk_搅拌站水泥罐仓顶除尘器设置及调整
  6. Java1.5增加了新特性:可变参数
  7. edp1.2和edp1.4_EDP​​的完整形式是什么?
  8. pl/sql中的赋值运算符_如何在SQL中使用AND / OR运算符?
  9. python 示例_带有示例的Python字典popitem()方法
  10. java类名与文件名_为什么Java文件名必须与公共类名相同?