实验来自《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();
}
}
}