天津大学计算机科学与技术操作系统原理实验2.docx

上传人:b****4 文档编号:6773376 上传时间:2023-05-10 格式:DOCX 页数:57 大小:26.73KB
下载 相关 举报
天津大学计算机科学与技术操作系统原理实验2.docx_第1页
第1页 / 共57页
天津大学计算机科学与技术操作系统原理实验2.docx_第2页
第2页 / 共57页
天津大学计算机科学与技术操作系统原理实验2.docx_第3页
第3页 / 共57页
天津大学计算机科学与技术操作系统原理实验2.docx_第4页
第4页 / 共57页
天津大学计算机科学与技术操作系统原理实验2.docx_第5页
第5页 / 共57页
天津大学计算机科学与技术操作系统原理实验2.docx_第6页
第6页 / 共57页
天津大学计算机科学与技术操作系统原理实验2.docx_第7页
第7页 / 共57页
天津大学计算机科学与技术操作系统原理实验2.docx_第8页
第8页 / 共57页
天津大学计算机科学与技术操作系统原理实验2.docx_第9页
第9页 / 共57页
天津大学计算机科学与技术操作系统原理实验2.docx_第10页
第10页 / 共57页
天津大学计算机科学与技术操作系统原理实验2.docx_第11页
第11页 / 共57页
天津大学计算机科学与技术操作系统原理实验2.docx_第12页
第12页 / 共57页
天津大学计算机科学与技术操作系统原理实验2.docx_第13页
第13页 / 共57页
天津大学计算机科学与技术操作系统原理实验2.docx_第14页
第14页 / 共57页
天津大学计算机科学与技术操作系统原理实验2.docx_第15页
第15页 / 共57页
天津大学计算机科学与技术操作系统原理实验2.docx_第16页
第16页 / 共57页
天津大学计算机科学与技术操作系统原理实验2.docx_第17页
第17页 / 共57页
天津大学计算机科学与技术操作系统原理实验2.docx_第18页
第18页 / 共57页
天津大学计算机科学与技术操作系统原理实验2.docx_第19页
第19页 / 共57页
天津大学计算机科学与技术操作系统原理实验2.docx_第20页
第20页 / 共57页
亲,该文档总共57页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

天津大学计算机科学与技术操作系统原理实验2.docx

《天津大学计算机科学与技术操作系统原理实验2.docx》由会员分享,可在线阅读,更多相关《天津大学计算机科学与技术操作系统原理实验2.docx(57页珍藏版)》请在冰点文库上搜索。

天津大学计算机科学与技术操作系统原理实验2.docx

天津大学计算机科学与技术操作系统原理实验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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2