#include#define ERR_EXIT(m)

do {

perror(m);

exit(EXIT_FAILURE);

} while(0)

int setup_daemon(int, int);

/* 守护进程一直在后台运行且无控制终端 */

int main(int argc, char *argv[])

{

//  daemon(0, 0)

setup_daemon(0, 0);

printf("test ...

"); // 无输出

for(;;) ;

return 0;

}

int setup_daemon(int nochdir, int noclose)

{

pid_t pid;

pid = fork();

if (pid == -1)

ERR_EXIT("fork error");

if (pid > 0)

exit(EXIT_SUCCESS);

/* 调用setsid的进程不能为进程组组长,故fork之后将父进程退出 */

setsid(); // 子进程调用后生成一个新的会话期

if (nochdir == 0)

chdir("/"); //更改当前目录为根目录

if (noclose == 0)

{

int i;

for (i = 0; i

close(i);

open("/dev/null", O_RDWR); // 将标准输入,标准输出等都重定向到/dev/null

dup(0);

dup(0);

}

return 0;

}

执行程序再ps axj 一下:

simba@ubuntu:~/Documents/code/linux_programming/APUE/process$ ./daemon

simba@ubuntu:~/Documents/code/linux_programming/APUE/process$ ps axj

PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND

...........................................................................................................................

1  7678  7678  7678 ?           -1 Rs    1000   0:03 ./daemon

可以看出守护进程的ID也是进程组的ID,也是会话期的ID,此外这个会话期没有前台进程组。

五、使用daemon函数实现守护进程

功能:创建一个守护进程

原型:int daemon(int nochdir, int noclose);

参数:

nochdir:=0将当前目录更改至“/”

noclose:=0将标准输入、标准输出、标准错误重定向至“/dev/null”

注:也有一些说法,表示daemon 实现是fork 2 次,具体可以google fork 2 times daemon,据说主要是为了避免子进程的僵尸进程问题。

C++ Code

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

int daemon()

{

int  fd;

pid_t pid;

if((pid = fork()) != 0)

{

exit(0);

}

setsid();

signal(SIGINT, SIG_IGN);

signal(SIGHUP, SIG_IGN);

signal(SIGQUIT, SIG_IGN);

signal(SIGPIPE, SIG_IGN);

signal(SIGTTOU, SIG_IGN);

signal(SIGTTIN, SIG_IGN);

signal(SIGCHLD, SIG_IGN);

signal(SIGTERM, SIG_IGN);

struct sigaction sig;

sig.sa_handler = SIG_IGN;

sig.sa_flags = 0;

sigemptyset(&sig.sa_mask);

sigaction(SIGPIPE,&sig,NULL);

umask(0);

if((pid = fork()) != 0)

{

exit(0);

}

fd = open("/dev/null", O_RDWR);

dup2(fd, STDIN_FILENO)

dup2(fd, STDOUT_FILENO)

return 0;

}

参考:《linux c 编程一站式学习》、《APUE》

linux 进程 控制终端,linux系统编程之进程(五):终端、作业控制与守护进程相关推荐

  1. 【Linux】Linux系统编程(入门与系统编程)(三)(深入理解操作系统、进程、环境变量、内存分布)

    本博客操作系统最多涉及30%的理论,重点在于部分进程的内容,部分文件系统的内容,部分文件管理的内容不是主讲操作系统,我们的最终目的是理解系统中最高频的知识点,然后被完全利用指导我们编程. 下面是这三篇 ...

  2. Linux shell、内核及系统编程精品资料下载汇总 topsage

    shell编程.sed.awk.grep相关: UNIX shell by Example 第四版 UNIX shell范例精解 (第4版) 中文高清PDF下载 Shell脚本学习指南(Classic ...

  3. 【Linux命令行与Shell脚本编程】第五章 理解 Shell 父子关系 后台进程 协程

    Linux命令行与Shell脚本编程 第五章 理解 Shell 文章目录 Linux命令行与Shell脚本编程 五,理解 Shell 5.1,shell的类型 5.2,shell的父子关系 5.2.1 ...

  4. linux 声音控制 命令,linux 声音大小调整的命令

    alsamixer 输入上面的命令 回车即可看到图形界面,界面如下 ┌──────────────────────────── AlsaMixer v1.0.27.1 ──────────────── ...

  5. linux scp控制带宽,Linux系统中安装使用Trickle来控制用户带宽

    1. trickle介绍trickle是一款轻量级的用户空间带宽控制管理的工具,用来限制如浏览器Firefox等, FTP , SSH,curl,wget,scp等等使用网络带宽. trickle通过 ...

  6. linux系统编程之信号(五)

    今天继续对信号进行学习,开始正入正题: sigaction函数: 安装信号之前我们已经学过一个函数:signal,它最早是在unix上出现的,它是对不可靠信号进行安装的,之后出现了可靠信号和实时信号, ...

  7. linux cache控制 内核,Linux内核中cache的实现

    本文档的Copyleft归yfydz所有,使用GPL发布,可以自由拷贝,转载,转载时请保持文档的完整性, 1. 前言 kmem_cache是Linux内核提供的快速内存缓冲接口,这些内存块要求是大小相 ...

  8. linux cache控制 内核,linux内核之bcache简介 [转]

    bcache是按照SSD特性来设计的,只按擦除桶大小进行分配,使用btree和日志混合方法来跟踪缓存数据,缓存数据可以是桶上的任意一个扇区.bcache最大程度上减少了随机写的代价,它按顺序填充一个桶 ...

  9. 嵌入式基于Linux电机控制,嵌入式linux下控制电机运动

    1.使用串口GPP8,GPP12口控制电机运转引脚(1-1:停止:1-0:正转:0-1:反转) 驱动代码: #include //kernel.h以便使用printk()等函数 #include // ...

最新文章

  1. 年薪 50w,这门编程语言该怎么学?
  2. C++ - 编写一个从字符串转变成长整型的函数
  3. node.js初步探究
  4. netbsd配置gnome桌面
  5. 已经连接到空闲例程的解决方法
  6. 2020 年,哪些行业将会遭到 5G 洗礼?
  7. 计算机专业中职好就业不,内江计算机专业中职好不好
  8. uBLAS——Boost 线性代数基础程序库 (三)
  9. 很喜欢博客园这个平台
  10. LwIP协议栈的学习与应用
  11. 填充图案的边界线 插件_cad如何给填充图案添加边界线
  12. 2021超级热门引流红包裂变微信分享朋友圈广告游戏源码
  13. 纪念 | 永远的凌晨四点钟
  14. 有幸一睡鸿蒙窍,《嘲鼾睡》原文、译文、翻译、赏析、拼音、作者韩愈-舟山诗词网...
  15. 超全面的前端切图技巧,读这篇就够了
  16. js去除字符串的首尾的逗号
  17. MYSQL 文件目录,数据库的存储文件目录
  18. 微型计算机原理和接口技术试卷,2017-1微机原理和接口技术试卷A(答案)-.doc
  19. unity3dwebgl building之后没有反应_晚会是在考验明星临场反应吗?王源开场无伴奏阿云嘎差点原地跳舞...
  20. 使用电脑实现图片文字识别的方法

热门文章

  1. 的union_C语言“隐秘的角落”——union没那么简单
  2. 重启服务器之home下文件全没,小白宝典——树莓派实用工具分享(大神绕路)
  3. input onclick点击button无反应_热图分析:精确洞察用户点击偏好
  4. logback.xml 常用配置详解
  5. 亲手完成四大企业实战项目,挑战Python全栈高薪岗位!
  6. GitHub 3W 星,冲击热榜!超实用技术面试手册,看这篇就够了
  7. oracle无法重建em,ORACLE 11g, EM 无法启动的问题和重建
  8. 判断一组多选框至少有一个被选中_想不想拥有自己的篆刻印章?那就PS一个吧...
  9. Oracle11g rac监听,关于oracle11g RAC 监听器使用中出现的no services以及no listener分析...
  10. 拨号云服务器怎么自动配置网关_教你在阿里云创建增强型云网关