`
oolala
  • 浏览: 103285 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
09c341db-7f05-3f2b-a572-9ee69a5d8a77
unix环境高级编程
浏览量:22706
社区版块
存档分类
最新评论

Unix环境高级编程笔记:13、守护进程

 
阅读更多
1 守护进程
    守护进程也称精灵进程(daemon)是生存期较长的一种进程。它们常常在系统自举时启动,仅在系统关闭时才终止。
    因为没的控制终端,所以它们是在后台运行的。
 
2、守护进程特征
    父进程ID为0的各进程通用是内核进程,它们作为系统自举过程中的一部分启动
    内核进程是特殊的,通用存在于系统的整个生命周期。它们以超级用户特权运行,无控制终端,无命令行。
 
    进程1通常是init,它是一个系统守护进程,负责启动各运行层次特定的系统服务。
 
    portmap网络端口映射服务
    syslogd守护进程把系统消息记入日志的任何程序使用
    xinted 侦听网络接口,取得来自网络的对各种网络服务进程的请求。  nfsd lockd rpciod
    cron
 
3、编程规则
    1)umask将文件模式创建屏蔽字设置为0    
    2)调用fork,然后使父进程退出
    3)调用setsid以创建一个新会话
    4) 将当前工作目录更改为根目录
    5)关闭不再需要的文件描述符
    6)某些守护进程打开/dev/null使其具有文件描述符0、1、2,这样任何一个试图读标准输入、写标准输出或标准出错的库例程都不会产生任何效果。
    
 
daemonize.c  想初始化成为一个守护进程的程序调用。    
#include <stdio.h>
#include <syslog.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
 
void daemonize(const char *cmd) {
int i,fd0,fd1,fd2;
pid_t pid;
struct rlimit r1;
struct sigaction sa;
 
umask(0);
 
if(getrlimit(RLIMIT_NOFILE,&r1) < 0) {
printf("%s:can`t get file limit",cmd);
exit(1);
}
if(pid=fork()) < 0) {
printf("%s:can`t fork",cmd);
} else if(pid !=0) {
exit(0);
}
 
setsid();
sa.sa_handler = SIG_IGN;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
if(sigaction(SIGHUP,&sa,NULL) <0) {
printf("%s:can`t ignore SIGHUP");
exit(1)
}
if((pid = fork)) < 0) {
printf("%s:can`t fork")
exit(1);
}
else if(pid != 0) {
exit(0)
}
 
if(chdir("/") < 0) {
printf("%s:can`t change directory to /");
exit(1);
}
 
if(r1.rlim_max == RLIM_INFINITY)
r1.rlim_max = 1024;
for(i=0;i<r1.rlim_max;i++) {
close(i);
}
 
 
fd0 = open("/dev/null",O_RDWR);
fd1 = dup(0);
fd2 = dup(0);
 
openlog(cmd,LOG_CONS,LOG_DAEMON);
if(fd0 !=0 ||fd1 != 1||fd2!=2) {
syslog(LOG_ERR,"unexpected file descriptors %d %d %d",fd0,fd1,fd2);
exit(1);
}
}
 
#include <unistd.h>
int daemon(int nochdir,int noclose);
 
在创建精灵进程的时候,往往需要将精灵进程的工作目录修改为"/"根目录 
并且将标准输入,输出和错误输出重定向到/dev/null 

daemon的作用就是当参数nochdir为0时,将根目录修改为工作目录 
noclose为0时,做输入,输出以及错误输出重定向到/dev/null 
 
#include <unistd.h>
int main(int argc, char *argv[])
{
    ...
    if (daemon(0, 0)) {//调用glibc库函数daemon,创建daemon守护进程
        perror("daemon");
        return -1;
    }
    好了执行到这里的就是daemon的子进程了[luther.gliethttp].
    ...
}
 
4、出错记录
    三种方式产生日志消息
    1)内核例程可以调用log函数
    2)用户进程(守护进程)调用syslog(3)函数以产生日志消息
    3)在此主机上的一个用户进程
 
    #include <syslog.h>
    openlog
    syslog
    closelog
    setlogmask
 
    
 
 
 
 
 
 
 
 
分享到:
评论

相关推荐

    APUE读书笔记《UNIX环境高级编程第二版》

    ### APUE读书笔记《UNIX环境高级编程第二版》知识点概览 #### 第一章 Unix基础 **1. Unix手册页** - 手册页是Unix系统中查询命令、函数等帮助文档的方式。 - 分类包括命令(1)、系统调用(2)、库函数(3)、特殊...

    APUE读书笔记(Unix高级环境编程)

    - **Unix手册页**:介绍如何使用`man`命令查询Unix/Linux系统中的命令、函数等的文档,是学习Unix编程的重要资料来源。 - **系统调用与库函数**:系统调用是应用程序与操作系统内核之间的接口,库函数则是对系统调用...

    学习《高级Linux环境编程》读书笔记(APUE读书笔记)

    《高级Linux环境编程》或称为APUE(Advanced Programming in the UNIX ...这本书不仅涵盖了UNIX编程的核心概念,还包括了许多实用的编程技巧和解决方案,是一本非常适合在Linux环境下从事系统编程学习的参考书籍。

    《LINUX与UNIX SHELL编程指南》读书笔记.pdf

    《LINUX与UNIX SHELL编程指南》是一本深入讲解Linux和Unix系统下Shell编程的经典书籍,通过对这本书的读书笔记分析,我们可以提炼出一系列关键的知识点,涵盖了系统管理、服务配置、软件更新以及网络服务配置等方面...

    Unix c学习笔记汇总.zip

    4. **C语言在Unix下的编程实践**:笔记可能包括了如何使用C语言编写Unix程序,如创建进程、打开文件、读写文件、创建守护进程等。这些实践经验对于深入理解Unix编程至关重要。 5. **Unix工具和命令**:Unix提供了...

    unix学习笔记(网上转来的,和朋友们一起分享)

    最后,笔记可能会介绍一些高级话题,如Unix的I/O重定向、信号处理、守护进程(daemon)以及Unix下的编程接口,如系统调用和C库函数。 总之,"Unix学习笔记"是一个全面的教程,旨在帮助初学者理解Unix的基本概念,...

    unix大全(涵盖了UNIX学习的方方面面)

    11.SCO TCP/IP网络管理---守护进程inetd 12.SCO TCP/IP网络管理---守护进程(daemon) 13.SCO TCP/IP网络管理---ifconfig命令的语法 14.SCO UNIX5的几个主要系统进程 15.SCO UNIX5 的动态核心表 16.进程管理的两个...

    Linux编程精髓 部分笔记

    ### Linux编程精髓部分知识点 #### 用户级内存管理 在Linux编程中,用户级内存管理是极为重要的一个方面,它涉及...以上是对“Linux编程精髓部分笔记”所涉及知识点的详细解释和总结,希望对学习Linux编程有所帮助。

    我的APUE2读书笔记

    设计一个良好的守护进程的一般编程规则** 守护进程需要脱离控制终端,忽略大多数信号等。 **2. 系统日志机制** 守护进程通常需要记录日志信息。 **3. daemon(3)函数** 用于将进程转变为守护进程。 **4. 守护进程...

    linux-note:《 LinuxUnix系统编程手册》笔记

    9. **守护进程与服务**:学习如何编写和管理守护进程,理解它们在系统后台运行的重要性。同时,探索服务的启动、监控和控制,如使用init或systemd管理服务。 10. **调试与性能分析**:掌握GDB等调试工具的使用,...

    Windows网络编程(第二版)

    - **守护进程**:介绍了守护进程的基本概念、启动方式、错误输出处理和建立方法。 **第四章 进程间通信** 该章重点介绍了进程间通信的不同方式和技术,如信号、管道、有名管道、文件和记录锁定、System V IPC等。 ...

    嵌入式linux工程师修炼笔记

    7. **嵌入式Linux应用开发**:这包括系统级编程,如服务、守护进程的编写,以及用户界面设计。理解和掌握Unix/Linux API,以及如何编写高效、线程安全的代码,是开发高质量嵌入式应用的关键。 8. **调试技巧**:...

    linux-LinuxMySQLNginxPHPGitShell等笔记

    学习Linux,你需要掌握基本的命令行操作,如ls、cd、mv、cp、rm等,以及文件系统结构、权限管理、用户与组的概念,还有进程管理、网络配置、系统服务与守护进程的控制。 【MySQL】:MySQL是一款关系型数据库管理...

    laptop-details.rar_Windows编程_Unix_Linux_

    Unix编程通常包括使用C、C++或其他语言开发系统级程序,比如服务守护进程、设备驱动等。Linux编程则涵盖了对Linux内核的理解、使用Linux API、编写shell脚本以及在Linux环境中构建和调试应用。开发者需要熟悉grep、...

    Clamav杀毒软件源码分析笔记

    Clamav的核心组件之一是`clamd`服务,它是Clamav的一个守护进程,用于接收客户端的扫描请求并执行扫描任务。`clamd`通过网络监听客户端的请求,并返回扫描结果。以下是`clamd`的部分源代码分析: ```c int main(int...

    操作系统学习笔记

    Hurd是一个由多个守护进程组成的系统,它们在微内核(如Mach)之上运行,提供了各种不同的功能和服务。 - **Ubuntu的关系**:Ubuntu是从Debian发展而来的,继承了Debian的许多优点,比如高质量的软件包管理系统和...

Global site tag (gtag.js) - Google Analytics