linux c语言学习笔记之守护进程
哈尔滨理工大学软件工程专业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 的作用由三个:
- 成为新的会话组的首进程 
- 成为新的进程组的首进程 
- 脱离控制终端 
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语言学习笔记之守护进程的更多相关文章
- Linux防火墙iptables学习笔记(三)iptables命令详解和举例[转载]
		Linux防火墙iptables学习笔记(三)iptables命令详解和举例 2008-10-16 23:45:46 转载 网上看到这个配置讲解得还比较易懂,就转过来了,大家一起看下,希望对您工作能 ... 
- linux基础命令学习笔记(二)
		linux基础命令学习笔记(二) 1.kill :终止进程 kill pid (唯一标示一个进程) kill -9 强制终止 kill -15 命令未结束不能终止 # ps aux 查看所有进程 ... 
- 兄弟连Linux运维学习笔记
		最新经典linux运维兄弟连Linux运维学习笔记... --------------- 全程1.5倍播放.加油我一定可以学完Linux----------------------Unix与Linux ... 
- Linux shell 菜鸟学习笔记....
		20171123 Linux shell 基础学习笔记1. shell 的开始 一般是 #!/bin/bash 通过 #! 来唯一指定使用的shell路径 其他的 # 都表示注释.2. shell 的 ... 
- 《C# 语言学习笔记》——C# 简介
		1 什么是.NET Framework .NET Framework 是Microsoft为开发应用程序而创建的一个富有革命性的新平台. 1.1 .NET Framework 的内容 .NET Fra ... 
- Go语言学习笔记(1)——顺序编程
		Go语言学习笔记这一堆主要是<Go语言编程>(人民邮电出版社)的读书笔记.中间会穿插一些零碎的点,比如源码学习之类的.大概就是这样吧. 1. 顺序编程 1.1 变量 变量的声明: var ... 
- Linux下iptables学习笔记
		Linux下iptables学习笔记 在Centos7版本之后,防火墙应用已经由从前的iptables转变为firewall这款应用了.但是,当今绝大多数的Linux版本(特别是企业中)还是使用的6. ... 
- HTML语言学习笔记(会更新)
		# HTML语言学习笔记(会更新) 一个html文件是由一系列的元素和标签组成的. 标签: 1.<html></html> 表示该文件为超文本标记语言(HTML)编写的.成对出 ... 
- linux第1天  fork exec 守护进程
		概念方面 文件是对I/O设备的抽象表示.虚拟存储器是对主存和磁盘I/O设备的抽象表示.进程则是对处理器.主存和I/O设备的抽象表示 中断 早期是没有进程这个概念,当出现中断技术以后才出现进程这个概念 ... 
随机推荐
- POJ 1681 高斯消元 枚举自由变元
			题目和poj1222差不多,但是解法有一定区别,1222只要求出任意一解,而本题需要求出最少翻转次数.所以需要枚举自由变元,变元数量为n,则枚举的次数为1<<n次 #include < ... 
- AcWing 204. 表达整数的奇怪方式
			#include<bits/stdc++.h> using namespace std; typedef long long LL; LL exgcd(LL a,LL b,LL & ... 
- 暑假自学java第三天
			1,java中有个c++中没有的数据类型 bite:byte的取值范围为-128~127,占用1个字节(-2的7次方到2的7次方-1) 在通常情况下,如果JAVA中出现了一个整数数字比如35,那么这个 ... 
- SpringBoot:springBoot注解大全
			springboot源码下载 https://github.com/spring-projects/spring-boot/releases 一.注解(annotations)列表 @SpringBo ... 
- 解决spring boot中文乱码问题
			在开发或学习当中,我们不可避免的会碰到中文乱码的问题(好想哭,但还是要保持微笑!) 今天,在学习spring boot中碰到了中文乱码问题. 首先,看了一下workspace是不是设置utf-8默认字 ... 
- 锁分析 Lock
			锁分析 Lock NonReentrantLock ReadLock 共享锁 ReentrantLock 重入锁 排他锁 sync.lock 返回值为void,表示如无异常发生都认为锁获取成功 Fai ... 
- swoole实现任务定时自动化调度详解
			开发环境 环境:lnmp下进行试验 问题描述 这几天做银行对帐接口时,踩了一个坑,具体需求大致描述一下. 银行每天凌晨后,会开始准备昨天的交易流水数据,需要我们这边请求拿到. 因为他们给的是一个bas ... 
- mac 下彻底卸载node和npm
			以下链接可供参考: https://segmentfault.com/a/1190000007445643 https://www.cnblogs.com/ChenGuangW/p/11398367. ... 
- 关于varnish缓存
			目录 缓存的概念 一.varnish缓存 1. 简介 2. 总体结构 2.1 两个主进程 2.1.1 Management进程 2.1.2 Child/Cacher进程 2.2 Varnish的日志收 ... 
- 公钥-私钥 白名单-黑名单 Linux 远程访问及控制(SSH)
			远程访问及控制一.SSH远程管理二.OpenSSH服务器① SSH (Secure Shell)协议② OpenSSH三.配置OpenSSH服务器举例四.sshd 服务支持两种验证方式五.使用SSH客 ... 
