linux服务器- 如何写后台进程

来源:互联网 发布:适合写日记的软件 编辑:程序博客网 时间:2024/05/22 03:07

区别于浏览器等展示性程序,运行于Linux系统上的网络服务器进程不需要前台展示,只需后台运行。此类进程即为Daemon进程(又叫精灵进程)。如Mysqld,Apached等。

Daemon进程实际为父进程fork()出来的子进程。但是会断开与控制终端的联系。

方法一:使用C系统函数daemon。

系统函数daemon可以使进程脱离控制终端,在系统后台以系统daemon的方式运行。

#include <unistd.h>int daemon(int nochdir, int  noclose);//nochdir:如果该参数值为0,则讲进程的当前路径修改为跟路径“/”。否则不变。//noclose:如果该参数值为0,则重定向标准输入,标准输出,标准出错到系统空洞设备/dev/null(此时,进程不会向文件描述符1和2输出信息,也不会从0接收输入)。否则不做改变。
直接调用daemon函数,是最简单的写出后台进程的方法。

方法二:自己实现daemon函数。

int daemon_my(int nochdir, int noclose){    //Clear file creation mask    umask(0);    //Get maximum number of file descriptors.    struct rlimit rl;    if(getrlimit(RLIMIT_NOFILE, &rl) < 0)        return -1;    pid_t pid;    if((pid=fork()) < 0) {        return -1;    }    else if(0 != pid) {        exit(0);    }    //child 1 continues...    //become session leader    if(setsid() < 0) {        return -1;    }    signal(SIGHUP, SIG_IGN);    if((pid=fork()) < 0) {        return -1;    }    else if(0 != pid) {        exit(0);    }    //child 2 continues...        //change working directory    if(0==nochdir) {        chdir("/");    }        //Close all open file descriptors.    if (rl.rlim_max == RLIM_INFINITY)        rl.rlim_max = 1024;    for (i = 0; i < rl.rlim_max; i++)        close(i);    //redirect stdin,stdout,stderror to "/dev/null"    int fd0, fd1, fd2;    if(0==noclose) {        fd0 = open("/dev/null", O_RDWR);        fd1 = dup(0);        fd2 = dup(0);    }        return 0;}

例子程序。

可以写一个最简单的例子程序验证。

/*test_daemon.c*/#include <unistd.h>int main(){    printf("i am father...\n");        daemon(0, 0);        sleep(10);    printf("i am child...\n");    return 0;}
编译运行。

屏幕输出:i am father...

然后转入后台。

ps 可以查看到进程还在运行。10s后结束运行。“i am child...”并没有输出到终端,这是因为调用daemon(,)函数时已经指定将stdout输出到/dev/null。

可以修改程序测试。


一般,运行后台进程时,在进程名后加“&”。也可以在程序中通过参数控制。


ok,写后台程序就是这么简单。

	
				
		
原创粉丝点击