daemon

来源:互联网 发布:sql删除数据的语句 编辑:程序博客网 时间:2024/06/09 01:27

守护进程是一个很重要的概念,但本质上就是一个去除所有可知的依赖以保持独立的进程,说的再多不如动手来一遍。

#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/stat.h>#include <sys/types.h>#include <fcntl.h>#include <syslog.h>void create_daemon_by_self(void){    pid_t pid_t1;    int ret = -1;    long fd_max = -1;    pid_t1 = fork();    //fork一个新进程    if(pid_t1 < 0)    {        perror("fork");        exit(0);    }    if(pid_t1 > 0)    {        printf("end parent process.\n");    //结束父进程        exit(0);    }    pid_t1 = setsid();    //设置新的会话    if(pid_t1 < 0)    {        perror("setsid");        exit(0);    }    ret = chdir("/");     //设置工作目录    if(ret < 0)    {        perror("chdir");        exit(0);    }    umask(0);             //设置最大的文件操作权限    fd_max = sysconf(_SC_OPEN_MAX);      //关闭所有的文件操作,一般关闭0,1,2就行了    for(int i = 0; i < fd_max; i++)    {        close(i);    }    open("/dev/null", O_RDWR);          //把标准输入输出标准错误绑定到一个空设备    dup(0);    dup(0);}void create_daemon_by_daemon(void){    int ret = -1;    printf("Hi, create_daemon_by_daemon.\n");    ret = daemon(0, 0);    //使用daemon接口创建守护进程,简单很多!!!!    if (ret != 0)        exit(0);}void do_something(void){    openlog("hello", LOG_PID | LOG_CONS, LOG_USER);    int count = 10;    while(count--)    {        sleep(1);        syslog(LOG_INFO, "hello world=%d", count);    }    closelog();}void do_exit(void){    printf("Hi, I'm exit.\n");}int main(int argc, char const *argv[]){    atexit(do_exit);    // create_daemon_by_self();    create_daemon_by_daemon();    do_something();    return 0;}


原创粉丝点击