服务器程序后台化以及守护进程的编写规范

一般的服务器程序都是以后台进程(守护进程)的方式运行,那么要如何使得服务器进程后台化呢?

下面介绍守护进程的编写遵循的步骤:

1. 创建子进程,关闭父进程;2. 设置文件权限掩码。当进程创建新文件(使用open(const char *pathname, int flags, mode_t mode)系统调用时,文件的权限将是mode&0777;

3. 创建新会话,设置本进程为进程组的首领;

4. 切换工作目录;

5. 关闭标准输入设备、标准输出设备和标准错误输出设备;

6. 关闭其他已经打开的文件描述符;

7. 将标准输入、标准输出、标准错误重定向到/dev/null文件

下面是一个例子:

bool daemonize()
{
    pid_t pid = fork();
    if ( pid < 0 )
    {
        return false;
    }
    else if ( pid > 0 )
    {
        exit( 0 );
    }

    umask( 0 );

    pid_t sid = setsid();
    if ( sid < 0 )
    {
        return false;
    }

    if ( ( chdir( "/" ) ) < 0 )
    {
        /* Log the failure */
        return false;
    }

    close( STDIN_FILENO );
    close( STDOUT_FILENO );
    close( STDERR_FILENO );

    open( "/dev/null", O_RDONLY );
    open( "/dev/null", O_RDWR );
    open( "/dev/null", O_RDWR );
    return true;
}

实际上,Linux提供了完成同样功能的库函数:

#include <unistd.h>
int daemon(int nochdir, int noclose);

其中,nochdir参数用于制定是否改变工作目录,如果nochdir = 0,则工作目录将被设置为根目录(/),否则继续使用当前工作目录。

noclose = 0时,标准输入、标准输出、标准错误都被重定向到/dev/null文件,否则依然使用原来的设备。

成功返回0,失败返回-1

时间: 2024-10-06 13:40:37

服务器程序后台化以及守护进程的编写规范的相关文章

守护进程的编写

目录 守护进程的编写 一,普通进程 二,守护进程 守护进程的编写 ps: 参考资料:linux C++通讯架构实战 卷1 一,普通进程 查看进程 ps -eo pid,ppid,sid,tty,pgrp,comm,stat,cmd | grep -E 'bash|PID|nginx' 这种进程都有各自对应的终端,终端退出,该进程也就退出,它的父进程是一个bash 终端被占用,你输入命令没有作用 如果放到后台(bg), 输入命令有用了,但是终端关闭进程仍然会退出 二,守护进程 定义:一种长期在后台

新手玩个人服务器(阿里云)--守护进程和ftp安装

作为一个体育爱好者,欣喜于彭帅杀进美网四强,也是职业生涯首次闯进大满贯赛四强.不知道是刻意安排还是有意为之,有些决赛冥冥之中就碰上了,而且竟深处脑海.09年高考语文的前一天晚上,我在守候费天王法网决赛终得佳音:10年除夕,娜姐澳网决赛惜败也曾见证.昨晚阿里云维护,闲来无事,不曾想目睹彭帅如此惊艳又勾起了昔日的一些画面-- 一:守护终端 node app通过终端每次启动的web服务,在关闭终端后就服务就退出了,为了能守住进程.所以可以通过forever了实现 安装 npm install fore

Java实现Linux下服务器程序的双守护进程

一.简介 现在的服务器端程序很多都是基于Java开发,针对于Java开发的Socket程序,这样的服务器端上线后出现问题需要手动重启,万一大半夜的挂了,还是特别麻烦的. 大多数的解决方法是使用其他进程来守护服务器程序,如果服务器程序挂了,通过守护进程来启动服务器程序. 万一守护进程挂了呢?使用双守护来提高稳定性,守护A负责监控服务器程序与守护B,守护B负责监控守护A,任何一方出现问题,都能快速的启动程序,提高服务器程序的稳定性. Java的运行环境不同于C等语言开发的程序,Java程序跑在JVM

Linux服务器程序规范

除了网络通信外,服务器程序还必须考虑许多其他细节问题,零碎,但基本上时模板式的. ---引 Linux服务器程序一般以后台形式运行.后台程序又称守护进程.它没有控制终端,因而也不会意外接受用户输入.守护进程的父进程一般是init进程(pid=1). Linux服务器程序通常有一套日志系统,它至少能输出日志到文件,有的高级服务器可以输出日志到专门的UDP服务器.大部分后台进程都在/var/log下有自己的日志目录. Linux服务器程序一般以某个专门的非root身份运行.mysqld, httpd

Unix网络编程代码 第13章 守护进程和inetd超级服务器

1. 概述 守护进程是在后台运行且不与任何控制终端关联的进程.unix系统通常有很多守护进程在后台运行,执行不同的管理任务.    守护进程没有控制终端通常源于它们由系统初始化脚本启动.然而守护进程也可能从某个终端由用户在shell提示符下键入命令行启动,这样的守护进程必须亲自脱离与控制终端的关联,从而避免与作业控制,终端会话管理,终端产生信号等发生任何不期望的交互,也可以避免在后台运行的守护进程非预期的输出到终端.    守护进程有多种启动方法:    1.在系统启动阶段,许多守护进程由系统初

孤儿进程、僵尸进程和守护进程

维基百科的解释中: 在操作系统领域中,孤儿进程指的是在其父进程执行完成或被终止 后仍继续运行的一类进程. 在类UNIX系统中,僵尸进程是指完成执行(通过 exit 系统调用,或运行时发生致命错误或收到终止信号所致)但在操作系统的进程表中仍然有一个表项(进程控制块PCB),处于"终止状态 "的进程. 在一個多工的電腦作業系統中,守护进程(英语:daemon,英语发音:/?di?m?n/或英语发音:/?de?m?n/)是一種在后台执行的电脑程序. 此类程序会被以进程的形式初始化. 守护进程

《Unix环境高级编程》读书笔记 第13章-守护进程

1. 引言 守护进程是生存期长的一种进程.它们常常在系统引导装入时启动,仅在系统关闭时才终止.它们没有控制终端,在后台运行. 本章说明守护进程结构.如何编写守护进程程序.守护进程如何报告出错情况. 2. 守护进程的特征 基于BSD的系统下执行:ps -axj -a 显示由其他用户所拥有的进程的状态:-x 显示没有控制终端的进程状态:-j 显示与作业有关的信息 基于System V的系统下执行:ps -efj Linux下执行以上两个命令输出一致 常见的守护进程: kswapd,内存换页守护进程.

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

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

Linux环境编程之进程(七):守护进程

守护进程也是一种进程,它由如下特性: 1.生存期较长,在系统自举时启动,仅在系统关闭时终止. 2.没有控制终端,在后台运行. 系统中有很多守护进程,它们执行日常事务活动.如日志进程syslogd.web服务器httpd.邮件服务器sendmail和数据块服务器mysqld等.大多数守护进程都是以超级用户(用户ID为0)特权运行.没有一个守护进程具有控制终端,其终端设置为问号(?),终端前台进程组ID设置为-1.内核守护进程以无控制终端方式启动.用户层守护进程缺少控制终端可能是守护进程调用了set