linux下守护进程的创建

最近在学习linux c编程

看到了守护进程的创建,感觉很好玩,

测试环境ubuntu 15.04

下面贴出测试代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/param.h>
#include <sys/stat.h>
#include <time.h>
#include <syslog.h>

int init_pro( void )
{
    int pid;    //进程号
    int i;

    /*忽略终端io信号,stop信号*/
    signal( SIGTTOU, SIG_IGN );
    signal( SIGTTIN, SIG_IGN );
    signal( SIGTSTP, SIG_IGN );
    signal( SIGHUP, SIG_IGN );

    /*在当前进程下开启一个新的进程*/
    pid = fork();
    //如果pid>0返回的是父进程的进程id,结束掉父进程
    if ( pid > 0 )
    {
        exit(0);    //结束父进程,使得子进程成为后台进程
    }
    else
    //如果pid小于0开启子进程失败,返回
    if ( pid < 0 )
    {
        return -1;
    }

    //建立一个新的进程组,在这个新的进程组里面,子进程成为这个进程的首进程,已使该进程脱离所有终端
    setsid();

    //再次通过fork建立一个新的子进程,即在刚才建立的子进程之下建立一个新的子进程
    //目的是保证该进程不是进程组长,同时让该进程无法再打开一个终端
    pid = fork();
    if ( pid > 0 )
    {
        exit(0);    //如果返回的是父进程(即之前的子进程)的pid那么结束这个进程
    }
    else
    if ( pid < 0 )
    {
        return -1;
    }

    //什么是NOFILE
    //关闭所有从父进程继承的不在需要的文件描述符
    //什么是文件描述符
    for( i = 0; i < NOFILE; close(i++) );

    //改变工作目录,使得进程不与任何文件系统联系
    //到这里其实只剩下最后一次开启的子进程了
    chdir("/");

    //将文件屏蔽字设为0
    umask(0);

    //忽略sigchld信号
    signal(SIGCHLD, SIG_IGN);

    return 0;
}

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

    syslog(LOG_USER|LOG_INFO, "测试守护进程!\n");
    while (1)
    {
        /* code */
        sleep(8);
        time(&now);
        syslog(LOG_USER|LOG_INFO, "系统时间:\t%s\t\t\n", ctime(&now));
    }
}

注意,在使用syslog之前,首先需要配置/etc/rsyslog.conf文件,在该文件最后添加user*/var/log/test.log

然后重新启动rsyslog服务

编译运行

我们打开test.log会发现每隔8秒他就回计时一次

使用ps -ef可以观察到

时间: 2024-07-30 14:24:21

linux下守护进程的创建的相关文章

Linux系统编程之--守护进程的创建和详解【转】

本文转载自:http://www.cnblogs.com/mickole/p/3188321.html 一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务.Linux系统的大多数服务器就是通过守护进程实现的.常见的守护进程包括系统日志进程syslogd. web服务器httpd.邮件服务器sendmail和数据库服务器

深入理解Linux操作系统守护进程的意义

Linux服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户.提供这些服务的程序是由运行在后台的守护进程(daemons)来执行的.守护进程是生存期长的一种进程.它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件.他们常常在系统引导装入时启动,在系统关闭时终止.linux系统有很多守护进程,大多数服务器都是用守护进程实现的.同时,守护进程完成许多系统任务,比如,作业规划进程crond.打印进程lqd等.有些书籍和资料也把

linux C守护进程编写

linux编程-守护进程编写 守护进程(Daemon)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待 处理某些发生的事件.守护进程是一种很有用的进程. Linux的大多数服务器就是用守护进程实现的.比如,Internet服务器inetd,Web服务器httpd等. 同时,守护进程完成许多系统任务.比如,作业规划进程crond,打印进程lpd等. 守护进程的编程本身并不复杂,复杂的是各种版本的Unix的实现机制不尽相同, 造成不同 Unix环境下守护进程的编程规则并不一

asp.net core2.0 部署centos7/linux系统 --守护进程supervisor(二)

原文:asp.net core2.0 部署centos7/linux系统 --守护进程supervisor(二) 续上一篇文章:asp.net core2.0 部署centos7/linux系统 --安装部署(一),遗留的问题而来,对程序添加守护进程,使网站可以持续化的运行起来. ? 1.介绍supervisor ?? ?Supervisor(http://supervisord.org/)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,

守护进程的创建方法与步骤

守护进程是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程是一种很有用的进程,Linux的大多服务器就是用守护进程实现的. 守护进程的创建步骤: 1.使进程在后台运行(创建子进程,父进程退出) if((pid=fork())>0) exit(0); else if (pid<0) { perror("fail to fork"); exit(-1); } 2.脱离控制终端,登录会话和进程组(创建新会话) 进程属于一个进程组

linux下查找进程及终止进程操作的相关命令

使用linux操作系统,难免遇到一些软件"卡壳"的问题,这时就需要使用linux下强大的kill命令来结束相关进程.这在linux系统下是极其容易的事情,你只需要kill xxx即可,这里xxx代表与此软件运行相关的进程PID号.首先,我们需要使用linux下另外一个命令ps查找与进程相关的PID号:ps aux | grep program_filter_word1)ps a 显示现行终端机下的所有程序,包括其他用户的程序.2)ps -A 显示所有程序.3)ps c 列出程序时,显示

Linux下的进程与线程(二)—— 信号

Linux进程之间的通信: 本文主要讨论信号问题. 在Linux下的进程与线程(一)中提到,调度器可以用中断的方式调度进程. 然而,进程是怎么知道自己需要被调度了呢?是内核通过向进程发送信号,进程才得以知道的. Linux系统的进程之间是通过信号来通信的. 程序员在Shell上显式地发送信号使用的是kill命令,原型如下: kill -sigid [-]pid 其中, sigid指示的是信号的id,pid前若有-,则pid代表的为进程组id,否则pid代表的为进程id kill函数也有相同的作用

linux下的进程管理(进程的基本了解及查看pstree,ps,pgrep命令)

Linux下的进程管理 1.什么是进程?程序是静态的文件进程是运行中的程序的一个副本进程存在生命周期(准备期,运行期,终止期)2.进程状态 状态 定义 R(TASK_RUNNING) . 可执行状态(RUNNING,READY)running:正在被处理 ready: 在排队, cpu处理进程个数有限 S(TASK_INTERRUPTIBLE) 可唤醒状态 :在cpu上使用的时间超时,此时被打入休眠状态,随着程序的调用会被唤醒 D(TASK_UNINTERRUPTIBLE) 不可唤醒状态 T(T

linux 下的使用 ln 创建 软链接 和 硬链接

linux 下的一个指令 ln 作用: 创建软链接或者硬链接 Linux 系统下每创建一个文件,系统都会为此文件生成一个 index node 简称(inode) ,而每一个文件都包含用户数据(user data) 与 元数据(metadata) 用户数据里记录了文件的真正内容. 元数据里记录的是文件的附加属性,如 文件大小,创建时间,所有者等,其中 上面提到的 index node 就保存在元数据中.在linux 中文件名并不是文件的唯一标识,index onde 才是唯一标示,系统查找文件也