linux 守护进程(daemon process)代码-详细注释

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); // 开启一个新会话
19
20 // 3.禁止再次打开控制终端
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

时间: 2024-10-21 08:31:18

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

python实现的守护进程(Daemon)的代码

将开发过程经常用的一些代码段记录起来,下边代码段是关于python实现的守护进程(Daemon)的代码,希望对小伙伴有一些用. def createDaemon(): "'Funzione che crea un demone per eseguire un determinato programma-"' import os # create - fork 1 try: if os.fork() > 0: os._exit(0) # exit father- except OS

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

Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为Linux开发与控制台无关的,需要在后台长时间不间断运行的“服务程序”,Daemon技术是非常重要的. Daemon程序一般用c/c++开发.不过,我今天要讲的,不是怎么用c/c++开发daemon,而是用C#! 一,创建Daemon程序: 用VS新建一个控制台项目,假设名称是MyDaemon,输入下

笔记整理--Linux守护进程

Linux多进程开发(三)进程创建之守护进程的学习 - _Liang_Happy_Life__Dream - 51CTO技术博客 - Google Chrome (2013/10/11 16:48:27) Linux多进程开发(三)进程创建之守护进程的学习 2013-07-04 17:25:35 标签:守护进程 daemon Linux多进程开发 系统编程 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://liam2199.bl

linux守护进程

#include <iostream>#include <unistd.h>//#include "curl/curl.h"#include "app_curl.h"#include "youtube_package.h"#include "CAutoMail.h"#include <fcntl.h>#include <signal.h>#include <unistd.h

C#开发Linux守护进程

C#开发Linux守护进程 Linux守护进程是Linux的后台服务进程,相当于Windows服务,对于为Linux开发服务程序的朋友来说,Linux守护进程相关技术是必不可少的,因为这个技术不仅仅是为了开发守护进程,还可以拓展到多进程,父子进程文件描述符共享,父子进程通讯.控制等方面,是实现Linux大型服务的基础技术之一. 去年我也曾写了一篇关于守护进程的帖子,名字叫<.NET跨平台实践:用C#开发Linux守护进程>,这篇文章的的确确实现了一个Daemon,不过,它有一个弱点,不能运行多

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

Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为Linux开发与控制台无关的,需要在后台长时间不间断运行的“服务程序”,Daemon技术是非常重要的. Daemon程序一般用c/c++开发.不过,我今天要讲的,不是怎么用c/c++开发daemon,而是用C#! 一,创建Daemon程序: 用VS新建一个控制台项目,假设名称是MyDaemon,输入下

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

Linux守护进程是Linux的后台服务进程,相当于Windows服务,对于为Linux开发服务程序的朋友来说,Linux守护进程相关技术是必不可少的,因为这个技术不仅仅是为了开发守护进程,还可以拓展到多子进程,父子进程,父子进程通讯与控制等方面,是实现Linux大型服务的基础技术之一. 去年我也曾写了一篇关于守护进程的帖子,名字叫<.NET跨平台实践:用C#开发Linux守护进程>,这篇文章的的确确实现了一个Daemon,不过,它有一个弱点,不能运行多线程! 这篇帖子的目的就是进一步完善,让

[Linux] 守护进程和守护线程

对于JAVA而言,一般一个应用程序只有一个进程——JVM.除非在代码里面另外派生或者开启了新进程. 而线程,当然是由进程开启的.当开启该线程的进程离开时,线程也就不复存在了. 所以,对于JAVA而言,线程是完全可以由自己的API自由产生.例如new Thread().但是进程就不同,必须通过调用OS的API,如Runtime.getRuntime.exec(). 所以说,进程是OS级别的概念. 守护线程和用户线程的区别: 二者其实基本上是一样的.唯一的区别在于JVM何时离开. 用户线程:当存在任

Linux守护进程简介和实例详解

简介 守护进程(Daemon)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程是一种很有用的进程.Linux的大多数服务器就是用守护进程实现的.比如,Internet服务器inetd,Web服务器httpd等.同时,守护进程完成许多系统任务.比如,作业规划进程crond,打印进程lpd等. 下面是linux系统中常见的一些守护进程. amd:自动安装NFS(网络文件系统)守侯进程apmd:高级电源管理 Arpwatch:记录日志并构建一个在L