一、简介

linux或者unix操作系统中在系统引导的时候会开启很多服务,这些服务就叫做守护进程。 守护进程脱离了终端并且在后台运行:守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程也不会被任何终端所产生的终端信息所打断。 本文介绍使用守护进程实现文件实时更新的方法步骤。

二、源码

文件1:Realtime_Update.c

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <time.h>
  5. #include <fcntl.h>
  6. #include <sys/stat.h>
  7.  
  8. void init_daemon(void);
  9. static inline int timespec_compare(const struct timespec *lhs, const struct timespec *rhs);
  10.  
  11. /**
  12. * 文件更新实时检测程序
  13. */
  14. main()
  15. {
  16. int ret;
  17. struct stat statbuff_file1;
  18. struct stat statbuff_file2;
  19. char *file1 = "~/test_file1.txt";
  20. char *file2 = "~/test_file2.txt";
  21.  
  22. stat(file1, &statbuff_file1);
  23. stat(file2, &statbuff_file2);
  24.  
  25. //初始化为Daemon
  26. init_daemon();
  27.  
  28. //循环执行,每秒一次
  29. while(1)
  30. {
  31. //判断文件是否更新
  32. ret = timespec_compare(&statbuff_file1.st_mtim, &statbuff_file2.st_mtim);
  33. if(ret > 0)
  34. {
  35. system("cp -a ~/test_file1.txt ~/test_file2.txt");
  36. }
  37.  
  38. sleep(1);//睡眠一秒钟
  39. }
  40. }
  41.  
  42. /**
  43. * lhs < rhs: return <0
  44. * lhs == rhs: return 0
  45. * lhs > rhs: return >0
  46. */
  47. static inline int timespec_compare(const struct timespec *lhs, const struct timespec *rhs)
  48. {
  49. if (lhs->tv_sec < rhs->tv_sec)
  50. return -1;
  51. if (lhs->tv_sec > rhs->tv_sec)
  52. return 1;
  53. return lhs->tv_nsec - rhs->tv_nsec;
  54. }

文件2:init.c

  1. #include <stdlib.h>
  2. #include <unistd.h>
  3. #include <signal.h>
  4. #include <sys/param.h>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7.  
  8. void init_daemon(void)
  9. {
  10. int pid;
  11. int i;
  12.  
  13. if(pid=fork())
  14. exit(0);//是父进程,结束父进程
  15. else if(pid< 0)
  16. exit(1);//fork失败,退出
  17.  
  18. //是第一子进程,后台继续执行
  19. setsid();//第一子进程成为新的会话组长和进程组长
  20. //并与控制终端分离
  21. if(pid=fork())
  22. exit(0);//是第一子进程,结束第一子进程
  23. else if(pid< 0)
  24. exit(1);//fork失败,退出
  25.  
  26. //是第二子进程,继续
  27. //第二子进程不再是会话组长
  28. for(i=0; i< NOFILE; ++i) //关闭打开的文件描述符
  29. close(i);
  30. chdir("/tmp");
  31. umask(0);//重设文件创建掩模
  32. return;
  33. }

编译

  1. gcc -o Realtime_Update init.c Realtime_Update.c

运行

  1. ./Realtime_Update

三、源码下载

C语言实现文件实时更新的更多相关文章

  1. 使用PhpStrom等IDE编辑 远程linux服务器上的文件 实时更新

    习惯了在linux上 vim进行PHP的开发,突然忘了IDE的感觉,所以想到了.通过PhpStrom等IDE直接编辑 samba共享到 mac或者windows本地的磁盘进行编辑. 为了忘却的纪念,有 ...

  2. 〖Linux〗实时更新 hosts 文件的脚本

    适用场景: 下载了一个smarthosts的hosts文件,但hosts文件过旧导致一些ip地址已失效无法访问网络. 脚本使用: ./hostsupdate # 直接从 /etc/hosts 中获得需 ...

  3. 【Python】分享使用的插件文件链接(实时更新)

    链接:https://pan.baidu.com/s/1o7AgHtw Python工具实时更新.

  4. facebook充值实时更新接口文档翻译 希望对做facebook充值的小伙伴有帮助

    Realtime Updates for Payments are an essential method by which you are informed of changes to orders ...

  5. sphinx通过增量索引实现近实时更新

    一.sphinx增量索引实现近实时更新设置 数据库中的已有数据很大,又不断有新数据加入到数据库中,也希望能够检索到.全部重新建立索引很消耗资源,因为我们需要更新的数据相比较而言很少. 例如.原来的数据 ...

  6. 数据可视化:Echart中k图实现动态阈值报警及实时更新数据

    1 目标 使用Echart的k图展现上下阈值,并且当真实值超过上阈值或低于下阈值时候,标红报警. 2 实现效果 如下:

  7. sphinx 增量索引 实现近实时更新

    一.sphinx增量索引的设置   数据库中的已有数据很大,又不断有新数据加入到数据库中,也希望能够检索到.全部重新建立索引很消耗资源,因为我们需要更新的数据相比较而言很少.例如.原来的数据有几百万条 ...

  8. unison + inotify 实现文件实时双向同步部署步骤

    unison + inotify 实现文件实时双向同步部署步骤 一. Unison简介 Unison是Windows.Linux以及其他Unix平台下都可以使用的文件同步工具,它能使两个文件夹(本地或 ...

  9. Core 2.0 的dll实时更新、https、依赖包变更问题及解决

    今天所有开发环境已经迁移到mac OS下的Visual Studio Code + 命令行编译发布,而运行服务器是CentOS7,和windows没什么关联了. 只要你Relese编译并在本地有一个与 ...

随机推荐

  1. 《深入理解 C# 第2版》 - 书摘精要

    (P13) 在很大程度上,C# 2 更像是对 C# 1 的各种不足之处的修修补补,所以并没有一鸣惊人.而 C# 3 中几乎所有特性都是为了构建 LINQ,并且其结果也十分特别: (P24) 为了让委托 ...

  2. BZOJ5334: [Tjoi2018]数学计算

    BZOJ5334: [Tjoi2018]数学计算 https://lydsy.com/JudgeOnline/problem.php?id=5334 分析: 线段树按时间分治即可. 代码: #incl ...

  3. LintCode Sliding Window Matrix Maximum

    原题链接在这里:http://www.lintcode.com/zh-cn/problem/sliding-window-matrix-maximum/ 题目: Given an array of n ...

  4. loj 6084.「美团 CodeM 资格赛」跳格子

    题目: link 题解: 尽量走\(a\). 只要保证走\(a\)后到达的点一定可以到终点就可以走. 所以从终点开始\(dfs\)出所有能够到达终点的点. 然后再从起点开始\(dfs\)路径即可. 如 ...

  5. 洛谷【P2024】[NOI2001]食物链

    浅谈并查集:https://www.cnblogs.com/AKMer/p/10360090.html 题目传送门:https://www.luogu.org/problemnew/show/P202 ...

  6. linux环境下搭建jenkins实现自动部署

    写在前面:公司项目初期,环境一切从始.因此,项目的发布环境需要自己搭建.就动手搭建了jenkins,在此把个人的搭建过程以及搭建中碰到的问题一起总结一下. 1. 准备环境. 首先,需要jdk是必须要安 ...

  7. c++11之三: sizeof运算符 auto的优势 __func__预定义标识符

    在C++11中,对非静态成员变量使用sizeof操作是合法的. auto推导的一个最大优势就是在拥有初始化表达式的复杂类型变量声明时简化代码.如:std:vector<std::string&g ...

  8. Azure CLI脚本查看未挂载的ManagedDisk

    本文介绍如何用Azure CLI的脚本查看未挂载的Managed Disk,以及Managed Disk挂载到哪些资源. 具体的脚本如下: #!/bin/bash rm -rf noownerdisk ...

  9. 通过扫码自定义链接安装iOS app,版本更新总结。

    1.打包ipa,plist工具:xcode6证书:企业级开发证书 1.1)xcode6开始企业级打包时不在生成plist,需要自己编写:模版见下: <?xml version="1.0 ...

  10. [转载]Linux驱动-SPI驱动 之二:SPI通用接口层

    通过上一篇文章的介绍,我们知道,SPI通用接口层用于把具体SPI设备的协议驱动和SPI控制器驱动联接在一起,通用接口层除了为协议驱动和控制器驱动提供一系列的标准接口API,同时还为这些接口API定义了 ...