鱼C论坛

 找回密码
 立即注册
查看: 655|回复: 1

[复制链接]
发表于 2024-10-16 10:48:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
用C编写一个守护进程,每隔一秒钟清理(删除)一下目录(自己指定)下的txt文件
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-10-16 10:49:29 | 显示全部楼层
创建一个守护进程需要一些步骤,包括脱离终端、创建新会话、处理信号等。下面是一个简单的示例程序,实现了每秒清理指定目录下的`.txt`文件。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <unistd.h>
  6. #include <dirent.h>
  7. #include <string.h>
  8. #include <fcntl.h>
  9. #include <signal.h>

  10. void daemonize() {
  11.     pid_t pid;

  12.     // 创建子进程
  13.     pid = fork();
  14.     if (pid < 0) {
  15.         exit(EXIT_FAILURE);
  16.     }
  17.     // 父进程退出
  18.     if (pid > 0) {
  19.         exit(EXIT_SUCCESS);
  20.     }

  21.     // 成为领导进程
  22.     if (setsid() < 0) {
  23.         exit(EXIT_FAILURE);
  24.     }

  25.     // 捕捉信号
  26.     signal(SIGCHLD, SIG_IGN);
  27.     signal(SIGHUP, SIG_IGN);

  28.     // 再次fork,保证不会重新获得终端
  29.     pid = fork();
  30.     if (pid < 0) {
  31.         exit(EXIT_FAILURE);
  32.     }
  33.     if (pid > 0) {
  34.         exit(EXIT_SUCCESS);
  35.     }

  36.     // 修改文件掩码
  37.     umask(0);

  38.     // 改变工作目录
  39.     chdir("/");

  40.     // 关闭文件描述符
  41.     for (int x = sysconf(_SC_OPEN_MAX); x >= 0; x--) {
  42.         close(x);
  43.     }
  44. }

  45. void clean_txt_files(const char *directory) {
  46.     struct dirent *entry;
  47.     DIR *dp = opendir(directory);

  48.     if (dp == NULL) {
  49.         perror("opendir");
  50.         return;
  51.     }

  52.     char filepath[1024];
  53.     while ((entry = readdir(dp))) {
  54.         // 检查文件扩展名是否是.txt
  55.         if (strstr(entry->d_name, ".txt") != NULL) {
  56.             snprintf(filepath, sizeof(filepath), "%s/%s", directory, entry->d_name);
  57.             remove(filepath);
  58.         }
  59.     }

  60.     closedir(dp);
  61. }

  62. int main() {
  63.     const char *directory = "/path/to/your/directory";  // 修改为你的目录路径

  64.     daemonize();

  65.     while (1) {
  66.         clean_txt_files(directory);
  67.         sleep(1);  // 每秒执行一次
  68.     }

  69.     return 0;
  70. }
复制代码


注意事项:
- 修改`/path/to/your/directory`为你要清理的实际目录路径。
- 确保你的程序有权限删除该目录下的文件。
- 运行该程序时需要以管理权限(如`root`用户)执行,以确保能够正常改变目录和关闭文件描述符。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-8 01:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表