`
jakielong
  • 浏览: 228491 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Linux Daemon In C

阅读更多

This is a template for a Linux daemon written in C. It includes:

  • Command-line argument handling via getopt
  • Signal Handling
  • Syslog output and filtering via setlogmask
  • Forking of process
  • Changing of file mode mask
  • Setting of Session ID
  • Closing of STDOUT, STDIN, and STDERR

The following code can be compiled using the following command (assuming gcc):

gcc -DDEBUG -o daemonname downloaded_file.c

The code:

/*
 * Example daemon shell code for all of the requirements of a basic
 * linux daemon written in C.
 *
 * To use this code, search for 'TODO' and follow the directions.
 * 
 * To compile this file:
 *      gcc -o [daemonname] thisfile.c
 *
 * Substitute gcc with cc on some platforms.
 *
 * Peter Lombardo (peter AT lombardo DOT info)
 * 5/1/2006
 *
 */
 
#include <sys /types.h>
#include </sys><sys /stat.h>
#include <stdio .h>
#include <stdlib .h>
#include <fcntl .h>
#include <errno .h>
#include <unistd .h>
#include <syslog .h>
#include <string .h>
#include <assert .h>
#include <signal .h>
 
// TODO: Change '[daemonname]' to the name of _your_ daemon
#define DAEMON_NAME "[daemonname]"
#define PID_FILE "/var/run/[daemonname].pid"
 
/**************************************************************************
    Function: Print Usage
 
    Description:
        Output the command-line options for this daemon.
 
    Params:
        @argc - Standard argument count
        @argv - Standard argument array
 
    Returns:
        returns void always
**************************************************************************/
void PrintUsage(int argc, char *argv[]) {
    if (argc >=1) {
        printf("Usage: %s -h -nn", argv[0]);
        printf("  Options:n");
        printf("      -ntDon't fork off as a daemon.n");
        printf("      -htShow this help screen.n");
        printf("n");
    }
}
 
/**************************************************************************
    Function: signal_handler
 
    Description:
        This function handles select signals that the daemon may
        receive.  This gives the daemon a chance to properly shut
        down in emergency situations.  This function is installed
        as a signal handler in the 'main()' function.
 
    Params:
        @sig - The signal received
 
    Returns:
        returns void always
**************************************************************************/
void signal_handler(int sig) {
 
    switch(sig) {
        case SIGHUP:
            syslog(LOG_WARNING, "Received SIGHUP signal.");
            break;
        case SIGTERM:
            syslog(LOG_WARNING, "Received SIGTERM signal.");
            break;
        default:
            syslog(LOG_WARNING, "Unhandled signal (%d) %s", strsignal(sig));
            break;
    }
}
 
/**************************************************************************
    Function: main
 
    Description:
        The c standard 'main' entry point function.
 
    Params:
        @argc - count of command line arguments given on command line
        @argv - array of arguments given on command line
 
    Returns:
        returns integer which is passed back to the parent process
**************************************************************************/
int main(int argc, char *argv[]) {
 
#if defined(DEBUG)
    int daemonize = 0;
#else
    int daemonize = 1;
#endif
 
    // Setup signal handling before we start
    signal(SIGHUP, signal_handler);
    signal(SIGTERM, signal_handler);
    signal(SIGINT, signal_handler);
    signal(SIGQUIT, signal_handler);
 
    int c;
    while( (c = getopt(argc, argv, "nh|help")) != -1) {
        switch(c){
            case 'h':
                PrintUsage(argc, argv);
                exit(0);
                break;
            case 'n':
                daemonize = 0;
                break;
            default:
                PrintUsage(argc, argv);
                exit(0);
                break;
        }
    }
 
    syslog(LOG_INFO, "%s daemon starting up", DAEMON_NAME);
 
    // Setup syslog logging - see SETLOGMASK(3)
#if defined(DEBUG)
    setlogmask(LOG_UPTO(LOG_DEBUG));
    openlog(DAEMON_NAME, LOG_CONS | LOG_NDELAY | LOG_PERROR | LOG_PID, LOG_USER);
#else
    setlogmask(LOG_UPTO(LOG_INFO));
    openlog(DAEMON_NAME, LOG_CONS, LOG_USER);
#endif
 
    /* Our process ID and Session ID */
    pid_t pid, sid;
 
    if (daemonize) {
        syslog(LOG_INFO, "starting the daemonizing process");
 
        /* Fork off the parent process */
        pid = fork();
        if (pid < 0) {
            exit(EXIT_FAILURE);
        }
        /* If we got a good PID, then
           we can exit the parent process. */
        if (pid > 0) {
            exit(EXIT_SUCCESS);
        }
 
        /* Change the file mode mask */
        umask(0);
 
        /* Create a new SID for the child process */
        sid = setsid();
        if (sid < 0) {
            /* Log the failure */
            exit(EXIT_FAILURE);
        }
 
        /* Change the current working directory */
        if ((chdir("/")) < 0) {
            /* Log the failure */
            exit(EXIT_FAILURE);
        }
 
        /* Close out the standard file descriptors */
        close(STDIN_FILENO);
        close(STDOUT_FILENO);
        close(STDERR_FILENO);
    }
 
    //****************************************************
    // TODO: Insert core of your daemon processing here
    //****************************************************
 
    syslog(LOG_INFO, "%s daemon exiting", DAEMON_NAME);
 
    //****************************************************
    // TODO: Free any allocated resources before exiting
    //****************************************************
 
    exit(0);
}
 
分享到:
评论

相关推荐

    《linux/UNIX系统编程手册》书上daemon章节测试实例代码(及简化)

    根据《linux/UNIX系统编程手册》的daemon章节写的一个测试become_daemon()函数程序。代码内容99%以上都是书上给的源码。...修改了 makefile文件,makefile.inc 文件未使用;修改了 ***.h&gt; 的路径。

    Linux下用C语言写的telnet服务器程序

    在本文档中,我们讨论的是一个使用C语言在Linux环境下编写的简单telnet服务器程序。这个服务器不包含用户名和密码验证机制,因此任何连接到该服务的用户将被视为服务启动者的身份登录系统。以下是该程序的一些关键...

    Bumblebee daemon and client rewritten in C.zip

    总结来说,将Bumblebee daemon和client重写为C语言是为了利用C语言的高效性和底层控制能力,以优化NVIDIA Optimus显卡在Linux环境下的性能。这一改动不仅提升了系统的响应速度,还降低了资源消耗,为用户提供了更好...

    Linux下使用daemon函数编写后台程序

    在Linux中专门提供了一个函数来完成这个daemon化的过程,这个函数的原型如下  int daemon (int __nochdir, int __noclose);  如果__nochdir的值为0,则将切换工作目录为根目录;如果__noclose为0,则将标准输入...

    The.Linux.Networking.Architecture

    The Linux® Networking Architecture: Design and Implementation of Network Protocols in the Linux Kernel By Klaus Wehrle, Frank Pählke, Hartmut Ritter, Daniel Müller, Marc Bechler Publisher :...

    Linux下用C写的一个telnet服务器 源码

    本文档提供了一份在Linux环境下使用C语言编写的简单Telnet服务器源代码。该服务器主要用于教学目的和实验环境搭建,允许用户通过网络进行远程登录与交互。 #### 二、关键库文件及功能介绍 1. **`&lt;stdarg.h&gt;`**:...

    vmtools-linux.iso

     这时我们并没有真正的安装上了VMWARE TOOLS软件包,如果您点击菜单:DEVICES,您就会发现光驱的菜单文字变为:ide1:0-&gt; C:\Program Files\VMware\VMware Workstation\Programs\linux.iso,这表示VMWARE将LINUX的ISO...

    linux进程监控和进程守护程序

    3a*8*daemon init 幸*启动配置文件当中的需要守护的程序 执行成功返回1,中途出错,返回-1 长界零家墨军零家零率家三哮零座零率零零容岸军零罕型率零零零零牢察座察零零零零季球军零容零 int moniter_ run(struct proc...

    linux守护进程随系统启动而启动

    在Linux环境下,通常使用C、Python、Perl或其他支持后台运行的编程语言来编写。守护进程应具备以下特性: 1. 与终端分离:守护进程不应有控制终端,通常通过调用`fork()`两次实现。 2. 改变工作目录:从根目录`/`...

    linux全志R16的linux系统编译的资料_20170502_1655.7z

    rm /home/wwt/linux_r16/lichee/out/sun8iw5p1/linux/common/buildroot/build/buildroot-config/zconf.tab.c make[1]:正在离开目录 `/home/wwt/linux_r16/lichee/buildroot/package/config' # # configuration ...

    Linux下32位mongodb安装包

    tar -zxvf mongodb-linux-i686-3.2.3.tgz -C /usr/local/ ``` 然后,创建一个软链接以便于管理: ```bash sudo ln -s /usr/local/mongodb-linux-i686-3.2.3 /usr/local/mongodb ``` 步骤5:配置MongoDB 创建一个...

    linux开启telnet服务

    Linux 提供服务是由运行在后台的守护程序(daemon)来执行的。守护进程的工作就是打开一个端口(port),等待(listen)进入的连接。在 C/S 模式中,如果客户提请了一个连接,守护进程就创建(fork)子进程来响应这...

    relax -- Linux speedstepping daemon-开源

    在Linux环境下,Relax作为一个守护进程(daemon)运行,持续监控系统的资源使用情况。当系统负载较低时,Relax会智能地降低CPU的运行频率,减少功率消耗;当系统需要处理更多任务时,它又会迅速提升CPU速度以保证...

    linux 进程控制阅读笔记

    为了更好地理解这些概念,你可以参考《Advanced Programming in the UNIX Environment》(APUE)等经典书籍,以及man手册页,这些都是学习Linux进程控制的重要资源。同时,实践操作也是不可或缺的一部分,尝试编写...

    Linux术语全称文本下载

    43. **cpp (C PreProcessor)**:C语言预处理器。 44. **cron (Chronos ϣʱ)**:定时任务调度程序。 45. **cups (Common Unix Printing System)**:Unix/Linux系统中的打印系统。 46. **cvs (Current Version System...

    Linux命令简写和全称

    - `-c`:发送指定次数的ECHO_REQUEST数据包后退出。 #### reboot - Restartyourcomputer - **全称**: Restart your computer - **用途**: 重启计算机。 - **语法**: `reboot` #### sudo - Superuser do/bin=...

    linux 命令英文全称

    cpp(C Pre Processor)是一个C语言的预处理器(pre-processor)。 #### cron=Chronos cron(Chronos)是一个定时任务计划程序(scheduled task program)。 #### cups=CommonUnixPrintingSystem CUPS(Common Unix ...

    lichee_20170502_1607_全志R16的linux系统编译需要改动的文件_使用parrotv1.1的内核_没有外层目录.7z

    rm /home/wwt/linux_r16/lichee/out/sun8iw5p1/linux/common/buildroot/build/buildroot-config/zconf.tab.c make[1]:正在离开目录 `/home/wwt/linux_r16/lichee/buildroot/package/config' # # configuration ...

    mongodb linux 64位

    sudo tar -zxvf mongodb-linux-x86_64-3.4.2.tgz -C /usr/local/ ``` 解压完成后,会生成一个名为`mongodb-linux-x86_64-3.4.2`的目录,通常我们可以将其重命名为更简洁的`mongodb`: ```bash sudo mv /usr/local/...

Global site tag (gtag.js) - Google Analytics