天津大学计算机科学与技术操作系统原理实验2.docx
《天津大学计算机科学与技术操作系统原理实验2.docx》由会员分享,可在线阅读,更多相关《天津大学计算机科学与技术操作系统原理实验2.docx(57页珍藏版)》请在冰点文库上搜索。
![天津大学计算机科学与技术操作系统原理实验2.docx](https://file1.bingdoc.com/fileroot1/2023-5/10/62998530-40e2-4726-b74c-03d98ef5a375/62998530-40e2-4726-b74c-03d98ef5a3751.gif)
天津大学计算机科学与技术操作系统原理实验2
操作系统实验2
(1)实验目的
完成一个监视指定的若干目录变动情况的(服务)程序。
(2)实验内容
利用inotify机制进行文件或文件夹的监控。
(3)实验结果
fileMonitor为程序名称,源码如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//#define_DEBUG
#define_DAEMON
#defineEVENT_NUM16
#defineBUF_SIZE10240
#ifdef_DAEMON
char*fileConf="/etc/fileMonitor.conf";
char*fileScan="/etc/fileMonitor.scan";
char*fileLog="/etc/fileMonitor.log";
#else
char*fileConf="fileMonitor.conf";
char*fileScan="fileMonitor.scan";
char*fileLog="fileMonitor.log";
#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(&now);
return(char*)asctime(timenow);
//printf("recenttimeis:
%s\n",asctime(timenow));
}
//forselect
intisready(intfd)
{
intrc;
fd_setfds;
structtimevaltv;
FD_ZERO(&fds);
FD_SET(fd,&fds);
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)
{
printf("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)
{
printf("sigactionerror.\n");
exit(3);
}
if((pid=fork())<0)
{
printf("fork2error.\n");
exit
(2);
}
elseif(pid>0)
{
exit(0);
}
if(chdir("/")<0)
{
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<0)
{
printf("Can'tOpen%s:
%s\n",LOCKFILE,strerror(errno));
syslog(LOG_INFO,"Can'tOpen%s:
%s",LOCKFILE,strerror(errno));
exit
(1);
}
if(lockfile(fd)<0)
{
if(errno==EACCES||errno==EAGAIN)
{
close(fd);
return1;
}
printf("Can'tlock%s:
%s\n",LOCKFILE,strerror(errno));
syslog(LOG_INFO,"Can'tlock%s:
%s",LOCKFILE,strerror(errno));
exit
(1);
}
ftruncate(fd,0);
sprintf(buf,"%ld",(long)getpid());
write(fd,buf,strlen(buf));
return0;
}
voidsigterm(intsigno)
{
syslog(LOG_INFO,"gotSIGTERM,EXIT");
fclose(fplog);
closelog();
exit(0);
}
voidreread(void)
{
syslog(LOG_INFO,"Re-readconfigurationfileok");
init(m_argc,m_argv);
}
voidsighup(intsigno)
{
syslog(LOG_INFO,"Re-Readingconfigurationfile");
reread();
}
intmain(intargc,char**argv)
{
#ifdef_DAEMON
structsigactionsa;
daemonize(argv[0]);
if(already_running())
{
printf("fileMonitoralreadyrunning\n");
syslog(LOG_INFO,"fileMonitoralreadyrunning\n");
exit
(2);
}
sa.sa_handler=sigterm;
sigemptyset(&sa.sa_mask);
sigaddset(&sa.sa_mask,SIGTERM);
sa.sa_flags=0;
if(sigaction(SIGTERM,&sa,NULL)<0)
{
syslog(LOG_INFO,"Can'tCatchSIGTERM:
%s",strerror(errno));
exit
(1);
}
sa.sa_handler=sighup;
sigemptyset(&sa.sa_mask);
sigaddset(&sa.sa_mask,SIGHUP);
sa.sa_flags=0;
if(sigaction(SIGHUP,&sa,NULL)<0)
{
syslog(LOG_INFO,"Can'tcatchSIGHUP:
%s",strerror(errno));
exit
(1);
}
#endif
m_argc=argc;
m_argv=argv;
fd=inotify_init();
if(fd<0){
#ifdef_DAEMON
memset(logmsg,0,500);
sprintf(logmsg,"Failtoinitializeinotify.\n");
syslog(LOG_INFO,logmsg);
#else
printf("Failtoinitializeinotify.\n");
#endif
exit(-1);
}
fplog=fopen(fileLog,"wb");
init(m_argc,m_argv);
memset(logmsg,0,500);
while
(1)
{
if(isready(fd))
{
if(len=read(fd,buffer,BUF_SIZE)){
offset=buffer;
#ifdef_DAEMON
memset(logmsg,0,500);
sprintf(logmsg,"%s\tSomeeventhappens,len=%d.\n",getTime(),len);
syslog(LOG_INFO,logmsg);
#else
memset(logmsg,0,500);
sprintf(logmsg,"%s\tSomeeventhappens,len=%d.\n",getTime(),len);
fwrite(logmsg,1,sizeof(logmsg),fplog);
#endif
#ifdef_DEBUG
printf("%s\tSomeeventhappens,len=%d.\n",getTime(),len);
#endif
event=(structinotify_event*)buffer;
while(((char*)event-buffer){
if(event->mask&IN_ISDIR)
{
strcpy(strbuf,"Direcotory");
}
else
{
strcpy(strbuf,"File");
}
#ifdef_DEBUG
#ifdef_DAEMON
memset(logmsg,0,500);
sprintf(logmsg,"\tObjecttype:
%s\n",strbuf);
syslog(LOG_INFO,logmsg);
#else
memset(logmsg,0,500);
sprintf(logmsg,"\tObjecttype:
%s\n",strbuf);
fwrite(logmsg,1,sizeof(logmsg),fplog);
printf("\tObjecttype:
%s\n",strbuf);
#endif
#endif
for(i=0;i{
if(event->wd!
=wd_array[i].wd)continue;
#ifdef_DAEMON
memset(logmsg,0,500);
sprintf(logmsg,"\tObjectname:
%s\n",wd_array[i].name);
syslog(LOG_INFO,logmsg);
#else
memset(logmsg,0,500);
sprintf(logmsg,"\tObjectname:
%s\n",wd_array[i].name);
fwrite(logmsg,1,sizeof(logmsg),fplog);
#ifdef_DEBUG
printf("\tObjectname:
%s\n",wd_array[i].name);
#endif
#endif
break;
}
#ifdef_DEBUG
#ifdef_DAEMON
memset(logmsg,0,500);
sprintf(logmsg,"\tEventmask:
%08X\n",event->mask);
syslog(LOG_INFO,logmsg);
#else
memset(logmsg,0,500);
sprintf(logmsg,"\tEventmask:
%08X\n",event->mask);
fwrite(logmsg,1,sizeof(logmsg),fplog);
printf("\tEventmask:
%08X\n",event->mask);
#endif
#endif
for(i=0;i{
if(event_array[i][0]=='\0')continue;
if(event->mask&(1<
{
#ifdef_DAEMON
memset(logmsg,0,500);
sprintf(logmsg,"\tEvent:
%s\n",event_array[i]);
syslog(LOG_INFO,logmsg);
#else
memset(logmsg,0,500);
sprintf(logmsg,"\tEvent:
%s\n",event_array[i]);
fwrite(logmsg,1,sizeof(logmsg),fplog);
#ifdef_DEBUG
printf("\tEvent:
%s\n",event_array[i]);
#endif
#endif
}
}
tmp_len=sizeof(structinotify_event)+event->len;
event=(structinotify_event*)(offset+tmp_len);
offset+=tmp_len;
}
fflush(fplog);
}
}
#ifdef_DAEMON
memset(logmsg,0,500);
sprintf(logmsg,"\tEsleeptime%d\r",sleeptime);
syslog(LOG_INFO,logmsg);
#else
printf("sleeptime%d\r",sleeptime);
fflush(stdout);
#endif
fflush(stdout);
init(m_argc,m_argv);
read(fd,buffer,BUF_SIZE);
sleep(sleeptime);
}
return0;
}
//readtheconfigurefromfile.conf
intreadConfig(char*filename)
{
FILE*fp;
fp=fopen(filename,"r");
if(fp==NULL)
{
#ifdef_DAEMON
memset(logmsg,0,500);
sprintf(logmsg,"%screated.\n",filename);
syslog(LOG_INFO,logmsg);
#else
printf("No%sexists.\n",filename);
printf("%screated.\n",filename);
#endif
resetConfig(filename);
fp=fopen(filename,"r");
if(fp==NULL)
{
#ifdef_DAEMON
memset(logmsg,0,500);
sprintf(logmsg,"%scannotread.\n",filename);
syslog(LOG_INFO,logmsg);
#else
printf("%scannotread.\n",filename);
#endif
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];//forrecordthefiles
//sothemaxfileTypecmdli