守护进程(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。

会话和进程组

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

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

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

可以用【ps ajx】查看session id

创建会话(session)

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

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

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

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

#include <sys/types.h>
#include <unistd.h>
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 <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <sys/time.h>
#include <time.h>
#include <signal.h>
#include <stdlib.h>
#include <stdio.h> #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
  • &:后台执行的意思

c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854

linux 进程通信之 守护进程的更多相关文章

  1. Linux编程之《守护进程》

    Intro ----- 守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程常 ...

  2. Linux 下Qt实现守护进程实例(转)

     原文地址:Linux守护进程的编程方法(含实例) 作者:lingdxuyan 参考文献 Linux信号列表(zz) Linux 守护进程的编程方法 linux上编写守护进程的例程 Linux下后台守 ...

  3. Linux进程托管与守护进程设置

    引言 在上一篇<Linux启动之旅>中,我们了解了Linux启动过程,在该过程的最后一步,init进程拉起/etc/init.d/rcN.d/目录下指定的守护进程(daemon).假若自定 ...

  4. Linux下一个简单守护进程的实现 (Daemon)

    在Linux/UNIX系统引导的时候会开启很多服务,这些服务称为守护进程(也叫Daemon进程).守护进程是脱离于控制终端并且在后台周期性地执行某种任务或等待处理某些事件的进程,脱离终端是为了避免进程 ...

  5. 一只简单的网络爬虫(基于linux C/C++)————守护进程

    守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程常常在系统引导装入时启动, ...

  6. (七) 一起学 Unix 环境高级编程(APUE) 之 进程关系 和 守护进程

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  7. python 进程锁 生产者消费者模型 队列 (进程其他方法,守护进程,数据共享,进程隔离验证)

    #######################总结######### 主要理解 锁      生产者消费者模型 解耦用的   队列 共享资源的时候 是不安全的 所以用到后面的锁 守护进程:p.daem ...

  8. python开发 *进程数据隔离.守护进程,进程同步工具 * 180725

    进程数据隔离.守护进程,进程同步工具 一.进程之间的数据隔离: from multiprocessing import Process n=100 #主程序中变量n= def func(): glob ...

  9. python多进程,进程池,数据共享,进程通信,分布式进程

    一.操作系统中相关进程的知识   Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊.普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前 ...

随机推荐

  1. [视频教程] 配置vscode的PHP自动补全提示与使用Xdebug进行远程调试debug

    默认下载安装完的vscode并不能准确提示和检测PHP的语法错误,需要手动指定一下本机的PHP程序路径.按下面的操作配置完后就能在文件保存的时候检测语法有无错误.打开文件->首选项->se ...

  2. Linxu:磁盘分区

    了解磁盘分区 磁盘的物理组成: 圆形的磁盘盘(主要记录数据的部分): 机械手臂,与在机械手臂上的磁盘读取头(可擦写磁盘盘上的数据): 主轴马达,可以转动磁盘盘,让机械手臂的读取头在磁盘盘上读写数据. ...

  3. CodeForces - 1256D (贪心+思维)

    题意 给定一个长度为n的二进制串(即由n个'0'和'1'构成的字符串),你最多可以进行k次交换相邻两个字符的操作,求字典序最小的串. 思路 大致就是找0的位置,然后贪心的放到最前面,这样字典序会最小: ...

  4. PyCharm2019.3专业版激活

    1. 首先到官网下载Professional(专业版),链接地址: https://www.jetbrains.com/pycharm/download/ 具体安装方法这里就不赘述 2. 下载补丁je ...

  5. (二)Amazon Lightsail 部署LAMP应用程序之部署单片LAMP应用程序

    部署单片LAMP应用程序 简介:通过复制应用程序代码并提供链接PHP前端和本地MySQL数据库的参数,将LAMP对战应用程序部署到先前启动的Lightsail实例中.完成后,Apache/PHP前端和 ...

  6. Appium滑动函数:Swipe()

    Appium处理滑动方法是swipe 滑动API:Swipe(int start x,int start y,int end x,int y,duration) 解释: int start x-开始滑 ...

  7. Centos 7 LAMP+wordpress

    一.简介        LAMP--->Linux(OS).Apache(http服务器),MySQL(有时也指MariaDB,数据库) 和PHP的第一个字母,一般用来建立web应用平台. 它是 ...

  8. 2019面向对象程序设计(java)课程学习进度条

    2019面向对象程序设计(java)课程学习进度条 周次 (阅读/编写)代码行数 发布博客量/评论他人博客数量 课余学习时间(小时) 学习收获最大的程序阅读或编程任务 1 20/10 1/0 5 九九 ...

  9. 浅谈this指向问题

    链接地址:https://www.jianshu.com/p/34572435b5d0

  10. slideDown()、slideUp()反复执行的问题

    <ul class="main"> <li><a href="#">菜单一</a> <ul> < ...