实验来自《UNIX操作系统实验教程》

实验内容:假设一个目录有一些重要文件,用编程方式设计一套方法,保证时刻检测该目录文件的安全性。

代码:

#define _GNU_SOURCE

#include <fcntl.h>

#include <signal.h>

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

 

//删除事件处理程序

static void handler_d(int sig,siginfo_t * si,void * data)

{

int event_fd,event_pid;

event_fd = si->si_fd;

event_pid = si->si_pid;

printf("process:%d,has deleted something from fd:%d!\n",event_pid,event_fd);

}

 

//修改事件处理程序

static void handler_m(int sig,siginfo_t * si,void * data)

{

int event_fd,event_pid;

event_fd = si->si_fd;

event_pid = si->si_pid;

printf("process:%d,has modified something of fd:%d!\n",event_pid,event_fd);

}

 

int main(void)

{

struct sigaction act_d,act_m;

int fd1,fd2;

pid_t pid;

if((pid=fork())<0){

printf("fork error\n");

exit(1);

}

else if(pid==0){

//子进程

if((fd1=open("/home/huazi/xue",O_RDONLY))==-1){

printf("open /home/huazi/xue error\n");

}

if((fd2=open("/home/huazi/hua",O_RDONLY))==-1){

printf("open /home/huazi/hua error\n");

}

//配置信号操作,或者说初始化结构体变量

act_m.sa_sigaction=handler_m;

sigemptyset(&act_m.sa_mask);

act_m.sa_flags=SA_SIGINFO;

//指定信号处理程序,或者说安装一个实时的自己定义的信号

sigaction(SIGRTMIN+2,&act_m,NULL);

//将fd1与信号关联起来

fcntl(fd1,F_SETSIG,SIGRTMIN+2);

//将事件声明成通知

fcntl(fd1,F_NOTIFY,DN_MODIFY|DN_MULTISHOT);

//对fd2

fcntl(fd2,F_SETSIG,SIGRTMIN+2);

fcntl(fd2,F_NOTIFY,DN_MODIFY|DN_MULTISHOT);

//deamon

while(1){

pause();

}

}

else{

if((fd1=open("/home/huazi/xue",O_RDONLY))==-1){

printf("open /home/huazi/xue error\n");

}

if((fd2=open("/home/huazi/hua",O_RDONLY))==-1){

printf("open /home/huazi/hua error\n");

}

//配置信号操作,或者说初始化结构体变量

act_m.sa_sigaction=handler_d;

sigemptyset(&act_m.sa_mask);

act_m.sa_flags=SA_SIGINFO;

//指定信号处理程序,或者说安装一个实时的自己定义的信号

sigaction(SIGRTMIN+2,&act_m,NULL);

//将fd1与信号关联起来

fcntl(fd1,F_SETSIG,SIGRTMIN+2);

//将事件声明成通知

fcntl(fd1,F_NOTIFY,DN_DELETE|DN_MULTISHOT);

//对fd2

fcntl(fd2,F_SETSIG,SIGRTMIN+2);

fcntl(fd2,F_NOTIFY,DN_DELETE|DN_MULTISHOT);

//deamon

while(1){

pause();

}

}

}

打开两个bash。一个bash运行此程序。另一个bash对两个文件夹进行操作。
------------------------------------------------------------------
[huazi@huazi xue]$ ls
file1  file2  file3
[huazi@huazi xue]$ rm file1
[huazi@huazi xue]$ cat >>file2 <<eof
> a
> b
> c
> eof
[huazi@huazi xue]$ cd ../hua
[huazi@huazi hua]$ ls
file1  file2  file3
[huazi@huazi hua]$ rm file2
[huazi@huazi hua]$ cat >>file3 <<eof
> a
> b
> c
> eof
------------------------------------------------------------------
[huazi@huazi ~]$ ./filesys_test.o 
process:1089,has deleted something from fd:3!
process:1089,has modified something of fd:3!
process:1089,has deleted something from fd:4!
process:1089,has modified something of fd:4!