哈尔滨理工大学软件工程专业08-7李万鹏原创作品,转载请标明出处

http://blog.csdn.net/woshixingaaa/archive/2010/06/06/5651095.aspx

守护进程 概述

守护进程( daemon )是生存期长的一种进程。它们常常在系统引导装入时起动,在系统关闭时终止。因为它们没有控制终端,所以说它们是在后台运行的。linux 系 统有很多守护进程,它们执行日常事物活动。

所有守护进程都以超级用户(用户I D 为0 )的优先权运行。

没有一个守护进程具有控制终端—终端名称设置为问号(?)、终端前台进程组I D 设置为-1 。缺少控制终端可能是精灵进程调用了s e t s i d 的结果。

除u p d a t e 以外的所有精灵进程都是进程组的首进程,对话期的首进程,而且是这些进程组和对话期中的唯一进程。u p d a t e 是它所在进程组和对话期(中的唯一进程,但是该进程组的首进程(可能也是该对话期的首进程)已经终止。

所有这些守护进程的父进程都是i n i t 进程。

守护进程编程5 步:

1. 首先做的是调用fork(), 然后使父进程exit, 这样做实现了以下几点, 如果该守护进程是由一条简单shell 启动的, 那么使父进程终止使
得shell 认为这条命令已经执行完成。第二, 子进程继承了父进程的进程组ID, 这就保证了子进程不是一个进程组的首进程. 这对于下面就要做的 setsid 调用是必要的前提

2. 调用setsid 以创建一个新的会话, 并担任该会话组的组长. 调用setsid 的作用由三个:

  1. 成为新的会话组的首进程

  2. 成为新的进程组的首进程

  3. 脱离控制终端

setsid() 函数格式:

#include <sys/types.h>

#incldue <unistd.h>

pid setsid() 成功时返回该进程组的ID, 失败时返回-1

3. 改变当前目录为根目录

chdir(“/”);

4. 重设文件权限掩码

umask(0);

由继承得来的文件方式创建屏蔽字可能会拒绝设置某些许可权, 例如: 若守护进程要创建一个组可读写的文件,

而继承的文件方式创建屏蔽字, 屏蔽了这两种许可权限, 则所要求的组可读写就不起作用.

5. 关闭不在需要的文件描述符

守护进程的出错处理:

守护进程完全脱离了控制终端,因此,不能像其他程序一样通过输出错误信息到控制台的方式来通知程序员。

通常的办法是使用 syslog 服务,将出错信息输入到“ /var/log/message” 系统日志文件中去。

Syslog 是 linux 中的系统由于日志管理服务通过守护进程 syslog 来维护。

守护进程的实例 :

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<fcntl.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>
#define MAXFILE 65535 // 最大的文件描述符
int main()
{
pid_t pc;
int i,fd,len;
char *buf="This is a Dameon/n";
len =strlen(buf);
pc=fork();
if(pc<0)
{
printf("error fork/n");
exit(1);
}
else if(pc>0)
exit(0); // 父进程退出 , 这个子进程变成孤儿进程 , 由 init 进程接管 ,
setsid(); // 变为后台程序
chdir("/");
umask(0); // 对所有的权限开放
for(i=0;i<MAXFILE;i++)
close(i); // 关闭所有的不需要的文件描述符
while(1) // 守护进程实现的服务
{
if((fd=open("/tmp/dameon.log",O_CREAT|O_WRONLY|O_APPEND,0600))<0) //open不是基于缓
冲区的,前面是要打开的文件, O_CREAT如果文件不存在就创建它,可读写,可追加,0600是访问权限最前面
的0表示文件的类型
{
perror("open");
exit(1);
}
write(fd, buf, len+1); //open函数获得了文件描述符,用write把buffer中的内容写入文件中
close(fd);
sleep(10);
}
}

查看结果

fighter@fighter:/tmp$ cat dameon.log

This is a Dameon

This is a Dameon

This is a Dameon

This is a Dameon

This is a Dameon

This is a Dameon

This is a Dameon

This is a Dameon

This is a Dameon

This is a Dameon

This is a Dameon

This is a Dameon

This is a Dameon

This is a Dameon

linux c语言学习笔记之守护进程的更多相关文章

  1. Linux防火墙iptables学习笔记(三)iptables命令详解和举例[转载]

     Linux防火墙iptables学习笔记(三)iptables命令详解和举例 2008-10-16 23:45:46 转载 网上看到这个配置讲解得还比较易懂,就转过来了,大家一起看下,希望对您工作能 ...

  2. linux基础命令学习笔记(二)

    linux基础命令学习笔记(二) 1.kill :终止进程  kill pid (唯一标示一个进程) kill -9  强制终止  kill -15 命令未结束不能终止 # ps aux 查看所有进程 ...

  3. 兄弟连Linux运维学习笔记

    最新经典linux运维兄弟连Linux运维学习笔记... --------------- 全程1.5倍播放.加油我一定可以学完Linux----------------------Unix与Linux ...

  4. Linux shell 菜鸟学习笔记....

    20171123 Linux shell 基础学习笔记1. shell 的开始 一般是 #!/bin/bash 通过 #! 来唯一指定使用的shell路径 其他的 # 都表示注释.2. shell 的 ...

  5. 《C# 语言学习笔记》——C# 简介

    1 什么是.NET Framework .NET Framework 是Microsoft为开发应用程序而创建的一个富有革命性的新平台. 1.1 .NET Framework 的内容 .NET Fra ...

  6. Go语言学习笔记(1)——顺序编程

    Go语言学习笔记这一堆主要是<Go语言编程>(人民邮电出版社)的读书笔记.中间会穿插一些零碎的点,比如源码学习之类的.大概就是这样吧. 1. 顺序编程 1.1 变量 变量的声明: var ...

  7. Linux下iptables学习笔记

    Linux下iptables学习笔记 在Centos7版本之后,防火墙应用已经由从前的iptables转变为firewall这款应用了.但是,当今绝大多数的Linux版本(特别是企业中)还是使用的6. ...

  8. HTML语言学习笔记(会更新)

    # HTML语言学习笔记(会更新) 一个html文件是由一系列的元素和标签组成的. 标签: 1.<html></html> 表示该文件为超文本标记语言(HTML)编写的.成对出 ...

  9. linux第1天 fork exec 守护进程

    概念方面 文件是对I/O设备的抽象表示.虚拟存储器是对主存和磁盘I/O设备的抽象表示.进程则是对处理器.主存和I/O设备的抽象表示 中断 早期是没有进程这个概念,当出现中断技术以后才出现进程这个概念 ...

随机推荐

  1. 让你发布的nuget包支持源代码调试

    前情概要 在不久的从前(也还是要以年为单位哈), 我们如果需要调试第三方代码, 或者框架代码很麻烦. 需要配置symbols, 匹配原始代码路径等. 为此, MS推出了 Source Link 功能, ...

  2. Spring官方发布新成员:Spring GraphQL

    近日,在GraphQL Java诞生6周年的时候,Spring社区通过博客宣布正式创建全新项目:Spring GraphQL,同时还发布了这个新项目的里程碑1.0版本. 博客原文:https://sp ...

  3. 『学了就忘』Linux基础 — 1、UNIX系统介绍

    目录 (一)UNIX系统介绍 1.UNIX系统发展历史 2.UNIX 主要发行版本 (二)GNU计划 1.GNU计划介绍 2.为何Stallman会发起这个GNU计划呢? 3.GNU的通用公共许可证: ...

  4. html javascript checkbox实现全选功能

    html代码 <input type="checkbox" id="all" />all</input> <input type= ...

  5. docker基本操作和部署

    #安装所需的软件包.yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data ...

  6. bugKu变量1

    重点:两个$$,这暗示着第二个$变量的值,作为第一个$的名称. 而且代码审计之后,发现只含有字母. 又暗示在变量中,那么猜想是在全局变量中,而php中全局变量是$GLOBALS.

  7. 基于Flink构建全场景实时数仓

    目录: 一. 实时计算初期 二. 实时数仓建设 三. Lambda架构的实时数仓 四. Kappa架构的实时数仓 五. 流批结合的实时数仓 实时计算初期 虽然实时计算在最近几年才火起来,但是在早期也有 ...

  8. 「SPOJ 3105」Power Modulo Inverted

    「SPOJ 3105」Power Modulo Inverted 传送门 题目大意: 求关于 \(x\) 的方程 \[a^x \equiv b \;(\mathrm{mod}\; p) \] 的最小自 ...

  9. iPhone X适配方案

    iPhone X适配方案 https://github.com/Wscats/iPhone-X 绝对长度单位 英寸 厘米 毫米 磅 pc inch cm mm pt pica 相对长度单位 是网页设计 ...

  10. C语言:数组长度的检测方法

    //数组长度的检测方法 #include <stdio.h> int main() { int arr[] = { 22, 34, 3, 32, 82, 55, 89, 50, 37, 5 ...