小孩子和大人做的网站简洁型网页
2026/4/18 16:09:11 网站建设 项目流程
小孩子和大人做的网站,简洁型网页,创业做旅游网站,引流推广网站#x1f525;作者简介#xff1a; 一个平凡而乐于分享的小比特#xff0c;中南民族大学通信工程专业研究生#xff0c;研究方向无线联邦学习 #x1f3ac;擅长领域#xff1a;驱动开发#xff0c;嵌入式软件开发#xff0c;BSP开发 ❄️作者主页#xff1a;一个平凡而…作者简介 一个平凡而乐于分享的小比特中南民族大学通信工程专业研究生研究方向无线联邦学习擅长领域驱动开发嵌入式软件开发BSP开发❄️作者主页一个平凡而乐于分享的小比特的个人主页✨收录专栏操作系统本专栏为讲解各操作系统的历史脉络以及各性能对比以及内部工作机制方便开发选择欢迎大家点赞 收藏 ⭐ 加关注哦C语言中的Daemon进程系统守护者的秘密 什么是Daemon进程在C语言中Daemon守护进程是在后台运行的特殊进程没有控制终端独立于用户会话运行通常用于提供系统级服务。它就像系统的隐形守护者。简单比喻普通进程就像办公室的前台接待员有明确的工作台终端直接与用户交互Daemon进程就像大楼的中央空调系统24小时在后台运行你感觉不到它的存在但没有它系统就无法正常工作 Daemon进程 vs 普通进程特性Daemon进程普通进程控制终端没有控制终端有控制终端运行位置后台运行前台/后台都可运行会话领导不是会话领导通常是会话领导文件描述符通常关闭所有文件描述符继承父进程的文件描述符工作目录通常切换到根目录在当前目录运行信号处理忽略某些信号如SIGHUP默认信号处理生命周期系统启动到关闭用户启动到结束 创建Daemon进程的步骤#includestdio.h#includestdlib.h#includeunistd.h#includesys/types.h#includesys/stat.h#includesignal.hvoidcreate_daemon(){pid_tpid;// 1. 创建子进程父进程退出pidfork();if(pid0){perror(fork);exit(1);}if(pid0){// 父进程退出exit(0);}// 2. 创建新会话成为会话领导if(setsid()0){perror(setsid);exit(1);}// 3. 忽略SIGHUP信号signal(SIGHUP,SIG_IGN);// 4. 再次fork确保不是会话领导pidfork();if(pid0){perror(fork);exit(1);}if(pid0){// 父进程退出exit(0);}// 5. 更改工作目录到根目录chdir(/);// 6. 设置文件权限掩码umask(0);// 7. 关闭所有文件描述符for(inti0;igetdtablesize();i){close(i);}// 8. 重定向标准I/O到/dev/nullintfdopen(/dev/null,O_RDWR);dup2(fd,STDIN_FILENO);dup2(fd,STDOUT_FILENO);dup2(fd,STDERR_FILENO);close(fd);} Daemon进程的作用系统架构示意图┌─────────────────────────────────────────┐ │ 用户空间 (User Space) │ ├─────────────────────────────────────────┤ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ Chrome │ │ VSCode │ │ SSH │ │ ← 用户进程 │ │ │ │ │ │ Client │ │ │ └─────────┘ └─────────┘ └─────────┘ │ │ │ ├─────────────────────────────────────────┤ │ 守护进程层 (Daemon Layer) │ ├─────────────────────────────────────────┤ │ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐│ │ │cron │ │syslog│ │sshd │ │apache││ ← Daemon进程 │ │ │ │ │ │ │ │ ││ │ └──────┘ └──────┘ └──────┘ └──────┘│ └─────────────────────────────────────────┘ 使用场景场景1系统服务守护进程// syslog_daemon.c - 系统日志守护进程示例#includestdio.h#includestdlib.h#includeunistd.h#includesyslog.h#includesignal.h#includetime.h#defineLOG_FILE/var/log/mydaemon.logvoidsignal_handler(intsig){if(sigSIGTERM){syslog(LOG_INFO,Daemon收到终止信号正在退出);closelog();exit(0);}}voiddaemon_work(){time_tnow;structtm*tm_info;while(1){time(now);tm_infolocaltime(now);// 记录系统状态syslog(LOG_INFO,Daemon运行中 - 时间: %02d:%02d:%02d,tm_info-tm_hour,tm_info-tm_min,tm_info-tm_sec);// 模拟工作检查日志文件大小FILE*fpfopen(LOG_FILE,r);if(fp){fseek(fp,0,SEEK_END);longsizeftell(fp);fclose(fp);if(size1024*1024){// 超过1MBsyslog(LOG_WARNING,日志文件过大: %ld bytes,size);}}sleep(60);// 每分钟执行一次}}intmain(){pid_tpidfork();if(pid0){perror(fork);exit(1);}if(pid0){// 父进程退出exit(0);}// 子进程继续setsid();chdir(/);umask(0);// 设置信号处理signal(SIGTERM,signal_handler);signal(SIGHUP,SIG_IGN);// 打开系统日志openlog(mydaemon,LOG_PID,LOG_DAEMON);syslog(LOG_INFO,Daemon进程启动);// 执行守护进程工作daemon_work();return0;}场景2网络服务守护进程// network_daemon.c - 简单HTTP服务守护进程#includestdio.h#includestdlib.h#includestring.h#includeunistd.h#includesys/socket.h#includenetinet/in.h#includesyslog.h#definePORT8080#defineMAX_CONN10voidhandle_client(intclient_fd){charresponse[]HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nHello from Daemon Server!;send(client_fd,response,strlen(response),0);close(client_fd);}voidstart_server_daemon(){intserver_fd,client_fd;structsockaddr_inaddress;intaddrlensizeof(address);// 创建socketif((server_fdsocket(AF_INET,SOCK_STREAM,0))0){syslog(LOG_ERR,Socket创建失败);exit(1);}// 设置socket选项intopt1;setsockopt(server_fd,SOL_SOCKET,SO_REUSEADDR,opt,sizeof(opt));address.sin_familyAF_INET;address.sin_addr.s_addrINADDR_ANY;address.sin_porthtons(PORT);// 绑定端口if(bind(server_fd,(structsockaddr*)address,sizeof(address))0){syslog(LOG_ERR,端口绑定失败);exit(1);}// 监听连接if(listen(server_fd,MAX_CONN)0){syslog(LOG_ERR,监听失败);exit(1);}syslog(LOG_INFO,HTTP守护进程在端口 %d 启动,PORT);// 主循环while(1){client_fdaccept(server_fd,(structsockaddr*)address,(socklen_t*)addrlen);if(client_fd0){syslog(LOG_WARNING,接受连接失败);continue;}syslog(LOG_INFO,接收到新的客户端连接);handle_client(client_fd);}}场景3定时任务调度器// task_scheduler.c - 定时任务调度守护进程#includestdio.h#includestdlib.h#includeunistd.h#includesyslog.h#includetime.h#includedirent.htypedefstruct{time_tlast_run;intinterval;// 执行间隔秒void(*task_func)(void);char*task_name;}ScheduledTask;voidcleanup_temp_files(){syslog(LOG_INFO,清理临时文件任务执行);// 实际清理逻辑}voidbackup_database(){syslog(LOG_INFO,数据库备份任务执行);// 实际备份逻辑}voidcheck_system_health(){syslog(LOG_INFO,系统健康检查执行);// 实际检查逻辑}ScheduledTask tasks[]{{0,300,cleanup_temp_files,清理临时文件},// 每5分钟{0,3600,backup_database,数据库备份},// 每小时{0,1800,check_system_health,系统健康检查},// 每30分钟{0,0,NULL,NULL}};voidrun_scheduled_tasks(){time_tcurrent_timetime(NULL);for(inti0;tasks[i].task_func!NULL;i){if(current_time-tasks[i].last_runtasks[i].interval){syslog(LOG_INFO,执行任务: %s,tasks[i].task_name);tasks[i].task_func();tasks[i].last_runcurrent_time;}}}intmain(){// 创建Daemon进程pid_tpidfork();if(pid0)exit(0);setsid();chdir(/);umask(0);// 初始化系统日志openlog(taskscheduler,LOG_PID,LOG_DAEMON);syslog(LOG_INFO,任务调度守护进程启动);// 初始化任务time_tstart_timetime(NULL);for(inti0;tasks[i].task_func!NULL;i){tasks[i].last_runstart_time;}// 主循环while(1){run_scheduled_tasks();sleep(10);// 每10秒检查一次任务}closelog();return0;} Daemon进程的最佳实践启动脚本示例#!/bin/bash# mydaemon.sh - Daemon进程管理脚本case$1instart)echo启动守护进程.../usr/sbin/mydaemonecho$!/var/run/mydaemon.pid;;stop)echo停止守护进程...kill$(cat/var/run/mydaemon.pid)rm-f /var/run/mydaemon.pid;;restart)$0stopsleep2$0start;;status)if[-f /var/run/mydaemon.pid];thenecho守护进程正在运行 (PID:$(cat/var/run/mydaemon.pid))elseecho守护进程未运行fi;;*)echo用法:$0{start|stop|restart|status}exit1;;esac 可视化Daemon进程生命周期普通进程启动 │ ├── 执行fork() ────┐ │ │ │ 创建子进程副本 │ │ │ 执行setsid() ← 脱离终端 │ │ │ 改变工作目录到 / │ │ │ 重设文件权限掩码 │ │ │ 关闭所有文件描述符 │ │ │ 重定向标准I/O到/dev/null │ │ │ 进入服务主循环 │ │ 父进程退出 持续运行 │ (直到系统关闭) │ │ 进程结束 日志记录 错误处理 信号响应 资源清理⚠️ 注意事项权限管理Daemon进程通常以root权限运行需要特别注意安全资源限制避免内存泄漏和文件描述符泄漏信号处理正确处理SIGTERM等信号以便优雅退出日志记录使用syslog而不是printf进行日志记录配置文件支持配置文件以便运行时调整参数单实例确保同一时间只有一个实例运行 调试技巧// 调试模式支持#ifdefDEBUG// 在前台运行输出到控制台#defineLOG(msg)printf([DEBUG] %s\n,msg)#else// 后台运行记录到系统日志#defineLOG(msg)syslog(LOG_INFO,%s,msg)#endifDaemon进程是Linux/Unix系统中不可或缺的组成部分它们默默地提供着各种基础服务。理解并正确使用Daemon进程是成为一名优秀系统程序员的重要一步

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询