linux 编写服务程序

来源:互联网 发布:java 多线程 ftp上传 编辑:程序博客网 时间:2024/06/13 05:11

以前我们在看《unix环境高级编程》的时候,有专门的整章详细介绍如何编写一个后台daemon程序(精灵程序),主要涉及到创建会话组,切换工作目录,设置文件屏蔽字,关闭不必要的描述符等多个操作。这些操作对于每一个后台程序来说都是类似的。

在Linux中专门提供了一个函数来完成这个daemon化的过程,这个函数的原型如下

int daemon (int __nochdir, int __noclose);

如果__nochdir的值为0,则将切换工作目录为根目录;如果__noclose为0,则将标准输入,输出和标准错误都重定向到/dev/null。

经过这个函数调用后的程序将运行在后台,成为一个daemon程序,而linux下大多的服务都是以此方式运行的。

我们来看一个简单的例子。例如编写例子程序test.c

#include <unistd.h>#include <stdio.h> int do_sth(){    //Add what u want
    printf("hello/n");     return 0;}int main(){    daemon(0,0);    while ( 1 )    {        do_sth();        sleep(1);    }}
编译并运行:
whc@ubuntu:~/test$ gcc -Wall  test.c -o www
         whc@ubuntu:~/test$ ./www
程序进入后台,通过ps查看进程情况,可以看到进程的父进程的id为1,即为init进程
whc@ubuntu:~/test$ ps -elf | grep www

5 S www-data 20173  6295  0  80   0 -  6038 -      05:04 ?        00:00:00 /usr/sbin/apache2 -k start
1 S whc      26721     1  0  80   0 -   390 -      10:14 ?        00:00:00 ./www
0 R whc      26752 26657  0  80   0 -   805 -      10:15 pts/4    00:00:00 grep www
用lsof查看www进程所打开的文件,可以看到文件描述符0,1,2都被重定向到/dev/null
whc@ubuntu:~/test$ /usr/bin/lsof -p 26721
COMMAND   PID USER   FD   TYPE DEVICE    SIZE   NODE NAME
www     26721  whc  cwd    DIR    8,1    4096      2 /
www     26721  whc  rtd    DIR    8,1    4096      2 /
www     26721  whc  txt    REG    8,3    6491 101021 /home/whc/weihua_work/守护进程/www
www     26721  whc  mem    REG    8,1 1364388 458293 /lib/tls/i686/cmov/libc-2.7.so
www     26721  whc  mem    REG    8,1  109152 432499 /lib/ld-2.7.so
www     26721  whc    0u   CHR    1,3           6448 /dev/null
www     26721  whc    1u   CHR    1,3           6448 /dev/null
www     26721  whc    2u   CHR    1,3           6448 /dev/null
并且能后看到,进程的当前工作目录(cwd)为根目录 '/',daemon函数已经帮助我们完成了daemon化的过程接下来我们只需关注程序功能的实现就可以了