daemon进程

daemon进程创建步骤

mydaemon.c

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <signal.h>
#include <fcntl.h>

#define ERROR(flag)                 if(flag)                        {                                    printf("%d: ",__LINE__);        fflush(stdout);                    perror("error");                exit(errno);                }

int init_daemon()
{
    pid_t pid = fork();
    ERROR(pid == -1);
    if(pid > 0)
        exit(0);
    printf("pid = %d\n",getpid());//--------------------------------------------------------
    int ret = setsid();
    ERROR(ret == -1);

//下面的创建新进程后,父退子留是system V的建议, 以保证不是会话的首进程, 防止取得控制终端
    pid = fork();
    ERROR(pid == -1);
    if(pid > 0)
        exit(0);
//--------------------------------------------------------
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);
//--------------------------------------------------------
    chdir("/");
//--------------------------------------------------------
    umask(0);
//--------------------------------------------------------
    signal(SIGCHLD,SIG_IGN);
}

int main(int argc, char *argv[])
{
    time_t now;

    init_daemon();

    while(1)
    {
        int fd = open("daemon.log",O_WRONLY | O_CREAT | O_APPEND, 0600);
        time(&now);
        char *s = ctime(&now);
        write(fd,s,strlen(s));
        sleep(2);
        close(fd);
    }

#if 0
    syslog(LOG_USER | LOG_INFO,"test daemon, pid = %d\n",getpid());
    while(1)
    {
        sleep(3);
        time(&now);
        syslog(LOG_USER | LOG_INFO,"hello now is: %s\n",ctime(&now));
    }
#endif
    return 0;
}

编译链接执行, 输出结果如下:

查询进程相关信息结果如下:

daemon进程的规则在init_daemon()函数中得到满足:

1. 调用fork()后父进程退出. 使得shell认为这条命令已完毕, 子进程不是一个进程组的组长.

2. 创建新会话(通过fork()创建新进程后,关闭父进程来保证成功). 该进程将没有控制终端

3. 关闭不需要的文件描述符

4. 当前工作目录改为根目录

5. 文件模式创建屏蔽字设置为0

6. 忽略SIGCHLD信号(似乎不必)

时间: 2024-10-05 12:13:43

daemon进程的相关文章

Linux daemon进程原理与使用

什么情况下用daemon进程 生产环境下,除了我们ssh登录上去,然后手动跑的那部分以外,其他都是自动运行的,这些大部分都应该是后台执行的.如何才能后台执行呢? nohup ./XXX & 由系统的其他daemon进程启动.这样的话,你的程序是它的子进程,跟终端没关系.退出终端也不会导致进程退出.如写在crontab里. 写成daemon程序,可以手动执行,退出终端时程序不退出. 如何选择呢? (1)首先,清理过期日志这一类需求,可以写一个死循环一直运行,也可以写在crontab里,每次执行完就

Linux daemon进程的应用、实现和原理

什么情况下用daemon进程 生产环境下,除了我们ssh登录上去,然后手动跑的那部分以外,其他都是自动运行的,这些大部分都应该是后台执行的.如何才能后台执行呢? nohup ./XXX & 由系统的其他daemon进程启动.这样的话,你的程序是它的子进程,跟终端没关系.退出终端也不会导致进程退出.如写在crontab里. 写成daemon程序,可以手动执行,退出终端时程序不退出. 如何选择呢? (1)首先,清理过期日志这一类需求,可以写一个死循环一直运行,也可以写在crontab里,每次执行完就

linux获取daemon进程的控制台数据

linux提供了一个daemon函数,使得进程可以脱离控制台运行,实现了后台运行的效果.但是进程后台运行后,原本在终端控制台输出的数据就看不到了.那么,怎样才能找回这些数据? 这里,文章主题就围绕着 如何获得后台进程的控制台数据,其中的原理要从daemon说起. daemon主要做两件事: 1.创建子进程,退出当前进程,并且以子进程创建新会话.这样,就算父进程退出,子进程也不会被关闭 2.将标准输入,标准输出,标准错误都重定向/dev/null daemon 实现大致如下: int daemon

Qualcomm 8X camera daemon进程浅析

Camera 先看一下抽象层的主要流程: 首先启动一个守护进程 int qcamsvr_start(void)( qcamsvr.c) { 1. server_fd = open(server_dev_name, O_RDWR);//打开服务对应的文件节点 2. if (mctl_load_comps()) //加载所有需要的组件 3. rc = qcamsvr_load_gesture_lib(&gesture_info.gesture_lib);//加载手势库 4. ez_server_so

daemon进程(转)

转自:http://www.pythoner.cn/home/blog/double-fork-when-creating-daemon/Daemon进程 守护进程(daemon)是指在UNIX或其他多任务操作系统中在后台执行的电脑程序,并不会接受电脑用户的直接操控.此类程序会被以进程的形式初始化.守护进程程序的名称通常以字母"d"结尾:例如,syslogd就是指管理系统日志的守护进程. 常见的Apache服务器(httpd),MySQL服务端(mysqld),作业规划进程(crond

Linux系统编程——Daemon进程

目录 Daemon进程介绍 前提知识 Daemon进程的编程规则 Daemon进程介绍 Daemon运行在后台也称作"后台服务进程". 它是没有控制终端与之相连的进程.它独立与控制终端.会话周期的执行某种任务. 那么为什么守护进程要脱离终端后台运行呢? 守护进程脱离终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程也不会被任何终端所产生的任何终端信息所打断. 那么为什么要引入守护进程呢? 由于在linux中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程

linux下的daemon进程

转自:http://www.cnblogs.com/xuxm2007/archive/2011/07/29/2121280.html   #include <unistd.h> int daemon(int nochdir,int noclose) 在创建精灵进程的时候,往往需要将精灵进程的工作目录修改为"/"根目录 并且将标准输入,输出和错误输出重定向到/dev/null daemon的作用就是当参数nochdir为0时,将根目录修改为工作目录 noclose为0时,做输

Daemon守护进程

Daemon守护进程 在linux中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程,都会依附于这个终端,这个终端就称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会自动关闭. 守护进程(Daemon)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程是一种很有用的进程.Linux的大多数服务器就是用守护进程实现的.比如,Internet服务器inetd,Web服务器httpd等.同时,守护进程完成许多系统任务,比

.NET跨平台实践:用C#开发Linux守护进程-Daemon

Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为Linux开发与控制台无关的,需要在后台长时间不间断运行的“服务程序”,Daemon技术是非常重要的. Daemon程序一般用c/c++开发.不过,我今天要讲的,不是怎么用c/c++开发daemon,而是用C#! 一,创建Daemon程序: 用VS新建一个控制台项目,假设名称是MyDaemon,输入下