linux应用编程和网络编程扩展--守护进程

    科技2025-05-17  7

    守护进程

    (1)daemon,表示守护进程,简称为d(进程名后面带d的基本就是守护进程) (2)长期运行(一般是开机运行直到关机时关闭) (3)与控制台脱离(普通进程都和运行该进程的控制台相绑定,表现为如果终端被强制关闭了则这个终端中运行的所有进程都被会关闭,背后的问题还在于会话) (4)服务器(Server),服务器程序就是一个一直在运行的程序,可以给我们提供某种服务(譬如nfs服务器给我们提供nfs通信方式),当我们程序需要这种服务时我们可以调用服务器程序(和服务器程序通信以得到服务器程序的帮助)来进程这种服务操作。服务器程序一般都实现为守护进程。 (5)常见守护进程(syslogd,系统日志守护进程,提供syslog功能)、(cron,cron进程用来实现操作系统的时间管理,linux中实现定时执行程序的功能就要用到cron) 

    如何实现守护进程

    (1)子进程等待父进程退出 (2)子进程使用setsid创建新的会话期,脱离控制台 (3)调用chdir将当前工作目录设置为/ (4)umask设置为0以取消任何文件权限屏蔽 (5)关闭所有文件描述符 (6)将0、1、2定位到/dev/null

    #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> void create_daemon(void); int main(void) { create_daemon(); while (1) { printf("I am running.\n"); sleep(1); } return 0; } // 函数作用就是把调用该函数的进程变成一个守护进程 void create_daemon(void) { pid_t pid = 0; pid = fork(); if (pid < 0) { perror("fork"); exit(-1); } if (pid > 0) { exit(0); // 父进程直接退出 } // 执行到这里就是子进程 // setsid将当前进程设置为一个新的会话期session,目的就是让当前进程 // 脱离控制台。 pid = setsid(); if (pid < 0) { perror("setsid"); exit(-1); } // 将当前进程工作目录设置为根目录 chdir("/"); // umask设置为0确保将来进程有最大的文件操作权限 umask(0); // 关闭所有文件描述符 // 先要获取当前系统中所允许打开的最大文件描述符数目 int cnt = sysconf(_SC_OPEN_MAX); int i = 0; for (i=0; i<cnt; i++) { close(i); } open("/dev/null", O_RDWR); open("/dev/null", O_RDWR); open("/dev/null", O_RDWR); }

     

    linux也提供了daemon函数用于创建守护进程

    int daemon(int nochdir, int noclose);

    1. daemon()函数主要用于希望脱离控制台,以守护进程形式在后台运行的程序。

    2. 当nochdir为0时,daemon将更改进城的根目录为root(“/”)。

    3. 当noclose为0是,daemon将进城的STDIN, STDOUT, STDERR都重定向到/dev/null。

     

    Processed: 0.012, SQL: 8