1、 进程组 组长不能创建新的 会话。

  其它进程可以创建新的会话,创建后既成为会话首领,同时失去控制终端。

2、 会话首领可以重新打开控制终端

1 #include <stdio.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4 #include <sys/param.h>
5 #include <sys/stat.h>
6 #include <sys/types.h>
7 #include <fcntl.h>
8 #include <signal.h>
9
10 void my_daemon() {
11 int pid, fd;
12
13 // 1.转变为后台进程
14 if ((pid = fork()) == -1) exit(1);
15 if (pid != 0) exit(0); // 父进程(前台进程)退出
16
17 // 2.离开原先的进程组,创建一个新会话,并脱离原终端。原终端断开后会通知原会话的控制进程,并不会通知此会话
18 if (setsid() == -1) exit(1); // 开启一个新会话,此PID为会话首进程
19
20 // 3.会话首进程,有权利再次连接终端。再fork一次,会话首进程退出,禁止子进程再次打开控制终端
21 if ((pid = fork()) == -1) exit(1);
22 if (pid != 0) exit(0); // 父进程(会话领头进程)退出
23
24 // 4.关闭打开的文件描述符,避免浪费系统资源
25 for (int i = 0; i < NOFILE; i++)
26 close(i);
27
28 // 5.改变当前的工作目录,避免卸载不了文件系统
29 if (chdir("/") == -1) exit(1);
30
31 // 6.重设文件掩码,防止某些属性被父进程屏蔽
32 if (umask(0) == -1) exit(1);
33
34 // 7.重定向标准输入,输出,错误流,因为守护进程没有控制终端
35 if ((fd = open("/dev/null", O_RDWR)) == -1) exit(1); // 打开一个指向/dev/null的文件描述符
36 dup2(fd, STDIN_FILENO);
37 dup2(fd, STDOUT_FILENO);
38 dup2(fd, STDERR_FILENO);
39 close(fd);
40
41 // 8.本守护进程的子进程若不需要返回信息,那么交给init进程回收,避免产生僵尸进程
42 if (signal(SIGCHLD, SIG_IGN) == SIG_ERR) exit(1);
43 }
44
45 #define INTERVAL 2
46
47 int main(int argc, char *argv[]) {
48 my_daemon(); // 首先使之成为守护进程
49
50 int t = 0;
51 FILE *fp = fopen("/root/tmp.txt", "a");
52 fprintf(fp, "ppid = %d, pid = %d, sid = %d, pgrp = %d\n", getppid(), getpid(), getsid(0), getpgrp());
53 fflush(fp);
54
55 do { // 测试此后台进程,每INTERVAL秒打印当前时间t,30秒后退出此后台进程
56 fprintf(fp, "%d\n", t);
57 fflush(fp); // 输出缓冲区内容到文件中
58 sleep(INTERVAL);
59 t += INTERVAL;
60 } while(t < 30);
61
62 fclose(fp);
63
64 return 0;
65 }

保存为daemon.c
编译命令 gcc daemon.c
运行 ./a.out
查看tmp.txt文件内容 cat /root/tmp.txt

linux 守护进程(daemon process)代码-详细注释的更多相关文章

  1. linux 守护进程 daemon

    Linux的Service/Daemon你真的懂了吗? Linux 守护进程的启动方法 linux系统编程之进程(八):守护进程详解及创建,daemon()使用 linux守护进程 daemon 详解

  2. .NET跨平台实践:用C#开发Linux守护进程-Daemon

    Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为L ...

  3. Linux守护进程daemon

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

  4. flask使用debug模式时,存在错误时,会占用设备内存直至服务重启才释放;debug模式会开启一个守护进程(daemon process)

    函数调用顺序flask的app.py的run-->werkzeug的serving.py的run_simple-->调用werkzeug的debug的__init__.py里的类Debug ...

  5. .NET跨平台实践:.NetCore、.Net5/6 Linux守护进程设计

    之前,我写过两篇关于用C#开发Linux守护进程的技术文章,分别是<.NET跨平台实践:用C#开发Linux守护进程>和<.NET跨平台实践:再谈用C#开发Linux守护进程 - 完 ...

  6. CentOS 7.4 初次手记:第一章 Linux守护进程(daemon)

    第一节 init & sysvinit 6 I sysvinit 运行顺序... 6 II Sysvinit和系统关闭... 7 III Sysvinit 的小结... 7 IV 运行级别.. ...

  7. 【转】学习Linux守护进程详细笔记

    [原文]https://www.toutiao.com/i6566814959966093837/ Linux守护进程 一. 守护进程概述 守护进程,也就是通常所说的Daemon进程,是Linux中的 ...

  8. 笔记整理--Linux守护进程

    Linux多进程开发(三)进程创建之守护进程的学习 - _Liang_Happy_Life__Dream - 51CTO技术博客 - Google Chrome (2013/10/11 16:48:2 ...

  9. .NET跨平台实践:用C#开发Linux守护进程

    Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为L ...

随机推荐

  1. 15年-ICPC长春-网络赛

    ID name status one word  POJ 5437 Alisha’s Party 赛后AC. 优先队列,模拟.对时间t排序 POJ 5438 Ponds 赛后AC 循环链表 POJ 5 ...

  2. App Transfer:苹果允许iOS App从一个开发者帐号转至另一个开发者账号

    App Transfer:苹果允许iOS App从一个开发者帐号转至另一个开发者账号 苹果在WWDC上宣布超过30万的开发者为iOS平台开发超过90万的应用,你可能会想到有人想出售或者购买app. 现 ...

  3. Samsung_tiny4412(驱动笔记07)----spinlock,semaphore,atomic,mutex,completion,interrupt

    /*********************************************************************************** * * spinlock,se ...

  4. what is bitcoin

  5. LDA模型应用实践-希拉里邮件主题分类

    #coding=utf8 import numpy as np import pandas as pd import re from gensim import corpora, models, si ...

  6. PNotes – 目前最优秀的桌面便签软件 - imsoft.cnblogs

    Pnotes: 下载链接: http://pan.baidu.com/s/1o6FK4SM 密码: n7il 便携版,包含中文语音包,包含十几种合适的皮肤. 更多信息:小众软件 http://www. ...

  7. Spring Data JPA Hibernate @QueryHints

    另一个实例: http://leobluewing.iteye.com/blog/2032396 : 本文内容来源:https://blog.csdn.net/gavinchen1985/articl ...

  8. 定时器setTimeout()的传参方法

    更具体的代码:http://www.cnblogs.com/3body/p/5416830.html // 由于setTimeout()的延迟执行特性,所以在执行的函数中直接使用外部函数的变量是无法获 ...

  9. oracle 拆分字符串并转换为表

    使用函数的方式 1. 创建的函数以及类型如下: CREATE OR REPLACE TYPE str_split IS TABLE OF VARCHAR2 (4000);CREATE OR REPLA ...

  10. JS 得细心的坑位

    <script> function test(link) { link = link || 'none'; alert(link); } function test2(){ var lin ...