网站制作致谢词,软件前端开发需要学什么,深圳网站优化方式,网络设计采用的方法和原则守护进程#xff08;Daemon#xff09;是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务#xff0c;不是对整个系统就是对某个用户程序提供服务。Linux系统的大多数服务器就是通过… 守护进程Daemon是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务不是对整个系统就是对某个用户程序提供服务。Linux系统的大多数服务器就是通过守护进程实现的。常见的守护进程包括系统日志进程syslogd、 web服务器httpd、邮件服务器sendmail和数据库服务器mysqld等。 守护进程一般在系统启动时开始运行除非强行终止否则直到系统关机都保持运行。守护进程经常以超级用户root权限运行因为它们要使用特殊的端口1-1024或访问某些特殊的资源。 一个守护进程的父进程是init进程因为它真正的父进程在fork出子进程后就先于子进程exit退出了所以它是一个由init继承的孤儿进程。守护进程是非交互式程序没有控制终端所以任何输出无论是向标准输出设备stdout还是标准出错设备stderr的输出都需要特殊处理。 守护进程的名称通常以d结尾比如sshd、xinetd、crond等 由对守护进程的介绍我们可以得到创建守护进程的步骤
创建子进程父进程退出让子进程的父进程为init进程在子进程中创建会话使用setsid()函数让子进程创建新的进程组并且让该进程组成为一个新的会话简单来讲就是子进程的进程id进程组id会话id并脱离终端控制改变当前目录为根目录或者为其他目录防止占用可卸载的文件系统重设文件权限掩码防止继承的文件创建屏蔽字拒绝某些权限关闭文件描述符将标准输入、标准输出、标准错误重定向到/dev/null开始执行守护进程核心工作退出守护进程
创建守护进程代码这里的守护进程每隔两秒将系统当前时间写入文件中
std::string getCurrentSystemTime()
{auto tt std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());struct tm* ptm localtime(tt);char date[60] { 0 };sprintf(date, %d-%02d-%02d-%02d.%02d.%02d,(int)ptm-tm_year 1900, (int)ptm-tm_mon 1, (int)ptm-tm_mday,(int)ptm-tm_hour, (int)ptm-tm_min, (int)ptm-tm_sec);return std::string(date) \n;
}int test_daemon() {pid_t pid fork();if (pid 0) {//父进程退出return 0;}//创建一个新会话并让子进程成为组长和会长setsid();//改变当前目录防止占用可卸载的文件系统chdir(/home/edward);//重设文件权限掩码防止继承的文件创建屏蔽字拒绝某些权限增加守护进程的灵活性umask(0002);//关闭文件描述符将标准输入、标准输出、标准错误重定向到/dev/null中close(STDIN_FILENO);open(/dev/null, O_RDWR);dup2(STDIN_FILENO, STDOUT_FILENO);dup2(STDIN_FILENO, STDERR_FILENO);//开始守护进程的工作int fd open(test_daemon.txt, O_RDWR | O_CREAT | O_TRUNC, 0666);check_error(fd, open error);constexpr int BUFFER_SIZE 1024;char buffer[BUFFER_SIZE];for (int i 0; i 10; i) {my_sleep(2, 0);strcpy(buffer, getCurrentSystemTime().c_str());write(fd, buffer, strlen(buffer));}//退出守护进程的工作check_error(close(fd), close error);
}其中my_sleep函数是我自己写的一个sleep函数check_error是检查返回值是否是-1如果是则通过perror输出错误信息并退出程序getCurrentSystemTime用于获取系统当前时间