天津大学计算机科学与技术操作系统原理实验2Word文档格式.docx
《天津大学计算机科学与技术操作系统原理实验2Word文档格式.docx》由会员分享,可在线阅读,更多相关《天津大学计算机科学与技术操作系统原理实验2Word文档格式.docx(57页珍藏版)》请在冰点文库上搜索。
#endif
structwd_name
{
intwd;
char*name;
};
intwd_NUM=0;
structwd_name*wd_array;
//structstatbuf;
//fordetiminethetypeoffile.
constintfilenameLen=500;
constintfilelistLen=10000;
charfiles[10000][500];
charbuffer[BUF_SIZE];
charlogmsg[500];
FILE*fplog;
intfd,wd;
char*offset=NULL;
structinotify_event*event;
intlen,tmp_len;
charstrbuf[16];
inti=0;
intm_argc;
char**m_argv;
intsleeptime=1;
char*event_array[]=
"
Filewasaccessed"
Filewasmodified"
Fileattributeswerechanged"
writtablefileclosed"
Unwrittablefileclosed"
Filewasopened"
FilewasmovedfromX"
FilewasmovedtoY"
Subfilewascreated"
Subfilewasdeleted"
Selfwasdeleted"
Selfwasmoved"
"
Backingfswasunmounted"
Eventqueuedoverflowed"
Filewasignored"
intinit(intargc,char**argv);
intreadConfig(char*filename);
intresetConfig(char*filename);
intreadScan(char*filename,intcur);
intparseCmd(char*filename,intargc,char**argv);
intexecCmd(char**dirs,char**f_files,char**filetypes,intdsize,intfsize,inttsize,char*filename,intflag);
//norecursively
intexecCmdN(char**dirs,intdsize,char*filename,intcur);
//recursively
intexecCmdR(char**dirs,intdsize,char*filename,intcur);
//withfiletype
intexecCmdT(char**dirs,char**filetypes,intdsize,inttsize,char*filename,intcur);
//onlyfiles
intexecCmdF(char**f_files,intfsize,intcur);
char*getTime()
time_tnow;
structtm*timenow;
charstrtemp[500];
time(&
now);
timenow=(structtm*)localtime(&
return(char*)asctime(timenow);
//printf("
recenttimeis:
%s\n"
asctime(timenow));
}
//forselect
intisready(intfd)
intrc;
fd_setfds;
structtimevaltv;
FD_ZERO(&
fds);
FD_SET(fd,&
tv.tv_sec=tv.tv_usec=0;
rc=select(fd+1,&
fds,NULL,NULL,&
tv);
if(rc<
0)//error
exit(-1);
returnFD_ISSET(fd,&
fds)?
1:
0;
//fordaemon
#defineLOCKFILE"
/var/run/fileMonitor.pid"
#defineLOCKMODE(S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)
intdaemonize(constchar*cmd)
inti,fd0,fd1,fd2;
pid_tpid;
structrlimitr1;
structsigactionsa;
umask(0);
//Clearfilecreationmask
if(getrlimit(RLIMIT_NOFILE,&
r1)<
0)
{
printf("
getrlimiterror.\n"
);
exit
(1);
}
if((pid=fork())<
0)
fork1error.\n"
exit
(2);
elseif(pid>
0)//Parent
exit(0);
setsid();
sa.sa_handler=SIG_IGN;
sigemptyset(&
sa.sa_mask);
sa.sa_flags=0;
if(sigaction(SIGHUP,&
sa,NULL)<
0)
sigactionerror.\n"
exit(3);
}
if((pid=fork())<
0)
{
fork2error.\n"
if(chdir("
/"
)<
printf("
chdirerror.\n"
exit(4);
//close(0);
/*closestdin*///forfile.scanandfile.conf
//close
(1);
/*closestdout*///forfile.scanandfile.conf
//close
(2);
/*closestderr*/
openlog(cmd,LOG_PID,LOG_USER);
syslog(LOG_INFO,"
fileMonitorStart\n"
intlockfile(intfd)
{
structflockf1;
f1.l_type=F_WRLCK;
f1.l_start=0;
f1.l_whence=SEEK_SET;
f1.l_len=0;
return(fcntl(fd,F_SETLK,&
f1));
}
intalready_running(void)
intfd;
charbuf[16];
fd=open(LOCKFILE,O_RDWR|O_CREAT,LOCKMODE);
if(fd<
Can'
tOpen%s:
%s\n"
LOCKFILE,strerror(errno));
%s"
if(lockfile(fd)<
if(errno==EACCES||errno==EAGAIN)
close(fd);
return1;
tlock%s:
ftruncate(fd,0);
sprintf(buf,"
%ld"
(long)getpid());
write(fd,buf,strlen(buf));
return0;
voidsigterm(intsigno)
gotSIGTERM,EXIT"
fclose(fplog);
closelog();
voidreread(void)
Re-readconfigurationfileok"
init(m_argc,m_argv);
voidsighup(intsigno)
Re-Readingconfigurationfile"
reread();
intmain(intargc,char**argv)
daemonize(argv[0]);
if(already_running())
fileMonitoralreadyrunning\n"
sa.sa_handler=sigterm;
sigaddset(&
sa.sa_mask,SIGTERM);
if(sigaction(SIGTERM,&
sa,NULL)<
tCatchSIGTERM:
strerror(errno));
sa.sa_handler=sighup;
sa.sa_mask,SIGHUP);
tcatchSIGHUP:
m_argc=argc;
m_argv=argv;
fd=inotify_init();
if(fd<
0){
memset(logmsg,0,500);
sprintf(logmsg,"
Failtoinitializeinotify.\n"
syslog(LOG_INFO,logmsg);
#else
#endif
exit(-1);
fplog=fopen(fileLog,"
wb"
memset(logmsg,0,500);
while
(1)
if(isready(fd))
{
if(len=read(fd,buffer,BUF_SIZE)){
offset=buffer;
memset(logmsg,0,500);
sprintf(logmsg,"
%s\tSomeeventhappens,len=%d.\n"
getTime(),len);
syslog(LOG_INFO,logmsg);
memset(logmsg,0,500);
sprintf(logmsg,"
fwrite(logmsg,1,sizeof(logmsg),fplog);
#ifdef_DEBUG
printf("
event=(structinotify_event*)buffer;
while(((char*)event-buffer)<
len)
{
if(event->
mask&
IN_ISDIR)
{
strcpy(strbuf,"
Direcotory"
}
else
File"
#ifdef_DEBUG
\tObjecttype:
%s\n"
strbuf);
#else
fwrite(logmsg,1,sizeof(logmsg),fplog);
printf("
#endif
for(i=0;
i<
wd_NUM;
i++)
if(event->
wd!
=wd_array[i].wd)continue;
\tObjectname:
wd_array[i].name);
memset(logmsg,0,500);
sprintf(logmsg,"
fwrite(logmsg,1,sizeof(logmsg),fplog);
printf("
break;
\tEventmask:
%08X\n"
event->
mask);
#else
EVENT_NUM;
if(event_array[i][0]=='
\0'
)continue;
(1<
<
i))
{
\tEvent:
event_array[i]);
memset(logmsg,0,500);
sprintf(logmsg,"
fwrite(logmsg,1,sizeof(logmsg),fplog);
printf("
}
tmp_len=sizeof(structinotify_event)+event->
len;
event=(structinotify_event*)(offset+tmp_len);
offset+=tmp_len;
}
fflush(fplog);
}
}
\tEsleeptime%d\r"
sleeptime);
#else
sleeptime%d\r"
sleeptime);
fflush(stdout);
init(m_argc,m_argv);
read(fd,buffer,BUF_SIZE);
sleep(sleeptime);
//readtheconfigurefromfile.conf
intreadConfig(char*filename)
FILE*fp;
fp=fopen(filename,"
r"
if(fp==NULL)
%screated.\n"
filename);
No%sexists.\n"
resetConfig(filename);
fp=fopen(filename,"
if(fp==NULL)
{
%scannotread.\n"
exit(-1);
}
intcur_file=0;
intcur_dir=0;
intcur_type=0;
char*f_dirs[500];
//forrecordthefiles
//sothemaxdirscmdlistlenis500
char*fileTypes[500];
//forrecordthefiletype
//sothemaxfileTypecmdlistlenis500
char*f_files[500];
//sothemaxfileTypecmdli