linux daemon代码完全注释

#include <unistd.h>
#include <signal.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/stat.h>

void init_daemon(void)
{        
    int pid;        
    int i;
    
    /*  when:step 1;
     *  what:将daemon放入后台运行;
     *  what:为避免挂起控制终端;
     *  how:在进程中调用fork使父进程终止,让daemon在子进程中后台运行。
     */
    if(pid=fork())
        exit(0);//是父进程,结束父进程
    else if(pid< 0)
        exit(1);//fork失败,退出
        
        
    /* when:step 2。
     * what:脱离控制终端,登陆会话和进程组
     *  why:当进程是回话组长时setsid()会失败,step1已经确保进程不是会话组长
     *  how:在子进程中调用setsid()
     */
    setsid(); 
    
    //PS: 调用成功后进程成为新的会话组长和新的进程组组长,并和原来的登陆会话和进程组脱离,由于会话对控制终端的独占性,进程同时和控制终端脱离。
 
    
    /* when:step3;
     * what:禁止进程重新打开控制终端;
     * why :无终端的会话组长能够重新申请打开一个控制终端;
     * how :使进程不再是会话组长
    */
    
    if(pid=fork())
        exit(0);//是第一子进程,结束第一子进程
    else if(pid< 0)
        exit(1);//fork失败,退出
    
    //PS:第一子进程即新会话组组长退出,第二子进程继续,但第二子进程不是新会话组组长

    
    /* when:step4;
     * what:关闭打开的文件描述符;
     * why :进程会从创建他的父进程那里继承打开的文件描述符,如不关闭,一方面会浪费系统资源,另一方便还会导致文             件无法删除文件系统无法卸载等无法预料的错误;
     * how :调用close()关闭打开的文件;
     */
    for(i=0; i< NOFILE; i++)
        close(i);
    
    
    /* when:step5;
     * what:改变当前工作目录;
     *  why:进程活动时,其工作目录所在的文件系统不能卸载
     *  how:一般需要调用chdir()将工作目录改变到根目录
    */
    chdir("/");
    
    
    /* when:step6;
     * what:重设文档创建掩码
     * why :进程冲创建他得父进程那里继承了文件创建掩码,他可能修改守护进程所创建的文件的读取权限
     * how :调用umask(0)清除文件创建掩码
    */
    umask(0);
    
    /* when:step7;
     * what:处理子进程结束信号SIGCHILD
     * why :防止子进程变成僵尸进程无法杀死,占用系统资源
     * how :在linux下忽略该信号即可
    */
    signal(SIGCHLD, SIG_IGN);
    
    return;
    
}

example.c:

int main(void)
{
    FILE *fp = NULL;
    time_t t;
    
    //初始化为daemon
    int_daemon();
    
    while (1){
        sleep(60);
        if ((fp = fopen("test.log", "a")) > 0){
            t = time(0);
            fprintf(fp, "i‘m here at %s\r\n", asctime(localtime(&t)));
            fclose(fp);
        }
    }
}
时间: 2024-08-27 18:51:50

linux daemon代码完全注释的相关文章

[转] Linux内核代码风格 CodingStyle [CH]

from:http://blog.csdn.net/jiang_dlut/article/details/8163731 中文版维护者: 张乐 Zhang Le <[email protected]> 中文版翻译者: 张乐 Zhang Le <[email protected]> 中文版校译者: 王聪 Wang Cong <[email protected]>                wheelz <[email protected]>        

动态规划代码 加注释

动态规划的原理就不多讲了,网上一大堆,google一下就明白了,直接上代码 1 public class DynamicPlan { 2 // 100 个人 挖 5 个矿 3 private static int peopleCount=100; 4 private static int poolCount=5; 5 // 挖每个矿时需要的人数 6 private static int[] peopleNeed={77,22,29,50,99}; 7 // 每个矿可以挖出来的金币数 8 priv

通过游戏学python 3.6 第一季 第三章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释 可复制直接使用 娱乐 可封装 函数

1 #猜数字--核心代码--猜测次数--随机函数和屏蔽错误代码---优化代码及注释 2 3 import random 4 number = random.randint(1,99)#设定答案(可以假设成年龄吧) 5 amount = random.randint(3,8) #设定猜测次数 6 print('本次游戏次数为',amount,'次') 7 8 count = 0 #设定初始次数 9 while count <= amount: #条件成立无限循环 10 try: 11 guess

大杀招之使用QEMU调试Linux内核代码

Linux内核代码的调试非常麻烦,一般都是加printk, 或者用JTAG调试. 这里的方法是用QEMU来调试Linux内核.因为QEMU自己实现了一个gdb server, 所以可以非常方便的使用gdb来调内核. 这对内核的学习也非常有帮助. 为了尽量不多花时间在QEMU设置上,这里直接使用以下的内核image: http://free-electrons.com/community/demos/qemu-arm-directfb/ 1. QEMU的安装 这个可以自己去QEMU的官网下载编译,

手把手教你调试Linux C++ 代码

手把手教你调试Linux C++ 代码 软件调试本身就是一项相对复杂的活动,他不仅要求调试者有着清晰的思路,而且对调试者本身的技能也有很高的要求.Windows下Visual Studio为我们做了很多的工作,使初学者基本上可以获得一个所见即所得的调试体验,相对来说也比较容易上手.然而在linux平台下,一切都显得有些不同,倒不是说GDB有多难,只是对于习惯了visual studio的人来说刚开始会有些不适应.然而对于那些在windows 平台下使用windbg调试代码的人来说,情况会好很多,

使用QEMU调试Linux内核代码

Linux内核代码的调试非常麻烦,一般都是加printk, 或者用JTAG调试.这里的方法是用QEMU来调试Linux内核.因为QEMU自己实现了一个gdb server, 所以可以非常方便的使用gdb来调内核. 这对内核的学习也非常有帮助. 为了尽量不多花时间在QEMU设置上,这里直接使用以下的内核image: http://free-electrons.com/community/demos/qemu-arm-directfb/ 1,QEMU的安装 这个可以自己去QEMU的官网下载编译,如果

通过游戏学python 3.6 第一季 第九章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改--锁定账号--锁定次数--菜单功能&#39;menufile

通过游戏学python 3.6 第一季 第九章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改--锁定账号--锁定次数--菜单功能'menufile 1 #猜数字--核心代码--猜测次数--随机函数和屏蔽错误代码---优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改--锁定账号--锁定次数--菜单功能'menufile' 2 #!usr/bin/env python 3 #-*-c

java中代码的注释和快捷键

java中代码的注释和快捷键 添加必要的注释,对一个有责任心.有道德模范的前端必须具备的好习惯, 可以大大提高代码的可维护性.可读性. java代码注释快捷键:ctrl+shift+/首先熟悉一下html.css.js的注释的写法:1.HTML注释语法: <!--注释的内容--> 2.css注释语法 /* 注释内容 */ /* ----------文字样式开始---------- */ 3.javaScript注释 //注释内容 /*注释内容*/ 接下来是对注释在这几种代码中使用的位置,如何写

去掉VS2010代码中文注释的红色下划线

VS2010代码中文注释出现红色下划线,代码看上去很不美观,发现是由于安装Visual Assist X插件造成的. 解决办法:打开VAX的Options对话框,取消Advanced --> Underlines --> "Undrline spelling errors in comments and string using..."上的勾即可.