高分求助--关于如何捕捉文件的改变

smokefire 2004-09-06 04:51:00
我要检查一个文件是否改变,当文件改变得时候就通知我一下.但是我不想使用轮询得方法 因为太耗CPU了,有什么别的办法可以建立像socket那样得东东 一有连接请求就建立链接?就是说文件一改变就通知我.同样得问题,比如文件夹增加一个文件.
另外,这些东东有普遍得方法解决么?我们经常问:你好了么?而"你"又不在我们程序控制得范围.
...全文
166 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
email2me 2004-10-28
  • 打赏
  • 举报
回复
我贴一段源码,应该有所帮助:
#define _GNU_SOURCE /* needed to get the defines */
60 #include <fcntl.h> /* in glibc 2.2 this has the needed
61 values defined */
62 #include <signal.h>
63 #include <stdio.h>
64 #include <unistd.h>
65
66 static volatile int event_fd;
67
68 static void handler(int sig, siginfo_t *si, void *data)
69 {
70 event_fd = si->si_fd;
71 }
72
73 int main(void)
74 {
75 struct sigaction act;
76 int fd;
77
78 act.sa_sigaction = handler;
79 sigemptyset(&act.sa_mask);
80 act.sa_flags = SA_SIGINFO;
81 sigaction(SIGRTMIN, &act, NULL);
82
83 fd = open(".", O_RDONLY);
84 fcntl(fd, F_SETSIG, SIGRTMIN);
85 fcntl(fd, F_NOTIFY, DN_MODIFY|DN_CREATE|DN_MULTISHOT);
86 /* we will now be notified if any of the files
87 in "." is modified or new files are created */
88 while (1) {
89 pause();
90 printf("Got event on fd=%d\n", event_fd);
91 }
92 }
zengjin8310 2004-10-28
  • 打赏
  • 举报
回复
fstat
smokefire 2004-09-08
  • 打赏
  • 举报
回复
to 古颜:
我也觉得是可行的,不过我没有用过select :) 你能否帮我写一下?我正在看select :)
smokefire 2004-09-08
  • 打赏
  • 举报
回复
顶起来
smaxll 2004-09-07
  • 打赏
  • 举报
回复
没有这样的信号。
collide 2004-09-07
  • 打赏
  • 举报
回复
signal中有一中信号是当目录发生改变时,发出信号,不过也可能时用fcntl,具体的我忘了,看unix环境高级编程,文件系统那一章的fcntl函数以及信号那一章。
smaxll 2004-09-07
  • 打赏
  • 举报
回复
想了一个方法,对file descriptor进行select的read阻塞。
在初始的可读之后,文件位置指针应该指向文件的末尾,
然后其他的改动selcet应该就能够得到可读的状态。

还没试过,不知道有可不可行。一会儿有时间试试。
smokefire 2004-09-07
  • 打赏
  • 举报
回复
自己顶一下
smokefire 2004-09-07
  • 打赏
  • 举报
回复
fcntl好像不行吧?行的话给段代码好么?
信号应该是没有的:如果有的话 下面哪个是?
SIGHUP 1 Term Hangup detected on controlling terminal
or death of controlling process
SIGINT 2 Term Interrupt from keyboard
SIGQUIT 3 Core Quit from keyboard
SIGILL 4 Core Illegal Instruction
SIGABRT 6 Core Abort signal from abort(3)
SIGFPE 8 Core Floating point exception
SIGKILL 9 Term Kill signal
SIGSEGV 11 Core Invalid memory reference
SIGPIPE 13 Term Broken pipe: write to pipe with no readers
SIGALRM 14 Term Timer signal from alarm(2)
SIGTERM 15 Term Termination signal
SIGUSR1 30,10,16 Term User-defined signal 1
SIGUSR2 31,12,17 Term User-defined signal 2
SIGCHLD 20,17,18 Ign Child stopped or terminated
SIGTSTP 18,20,24 Stop Stop typed at tty
SIGTTIN 21,21,26 Stop tty input for background process
SIGTTOU 22,22,27 Stop tty output for background process
SIGBUS 10,7,10 Core Bus error (bad memory access)
SIGPOLL Term Pollable event (Sys V). Synonym of SIGIO
SIGPROF 27,27,29 Term Profiling timer expired
SIGSYS 12,-,12 Core Bad argument to routine (SVID)
SIGTRAP 5 Core Trace/breakpoint trap
SIGURG 16,23,21 Ign Urgent condition on socket (4.2 BSD)
SIGVTALRM 26,26,28 Term Virtual alarm clock (4.2 BSD)
SIGXCPU 24,24,30 Core CPU time limit exceeded (4.2 BSD)
SIGXFSZ 25,25,31 Core File size limit exceeded (4.2 BSD)
SIGIOT 6 Core IOT trap. A synonym for SIGABRT
SIGEMT 7,-,7 Term
SIGSTKFLT -,16,- Term Stack fault on coprocessor (unused)
SIGIO 23,29,22 Term I/O now possible (4.2 BSD)
SIGCLD -,-,18 Ign A synonym for SIGCHLD
SIGPWR 29,30,19 Term Power failure (System V)
SIGINFO 29,-,- A synonym for SIGPWR
SIGLOST -,-,- Term File lock lost
SIGWINCH 28,28,20 Ign Window resize signal (4.3 BSD, Sun)
SIGUNUSED -,31,- Term Unused signal (will be SIGSYS)
Wugifer 2004-09-06
  • 打赏
  • 举报
回复
用 fcntl 试试吧
bshawk 2004-09-06
  • 打赏
  • 举报
回复
我想不采用“轮询”好象不太可能?
除非从修改文件系统入手也许有可能?!
onlyf 2004-09-06
  • 打赏
  • 举报
回复
有没有办法知道会有什么程序改变这个文件?
由这个程序通知就行了。

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧