C语言文件监控函数 c语言键盘监控

如何用C语言监视一文件,(可以隔一定时间检测该文件),当文件相比较上一时间有改动时,读出改动处

、“网络监视器”的基本使用

目前创新互联已为成百上千的企业提供了网站建设、域名、网络空间、网站托管维护、企业网站设计、双清网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

欲打开“网络监视器”,只需依次选择“开始→程序→附件→系统工具→网络监视器”即可进入其主窗口。

对于“网络监视器”中的功能,既可以选择菜单中的相应项目,也可以通过直接单击工具栏上的相应按钮来实现。在其主窗口工具栏上的按钮,从左到右作用依次为:

1.选择服务器:通过它可对其他计算机的“网络监视器”进行远程管理。具体的使用方法请参见后文相关内容。

2.断开用户连接:通过它可强行中断列表中指定用户对本机的连接。

3.关闭文件:通过它可强行关闭列表中指定用户所打开的指定共享文件。

4.添加共享:通过它可根据提示直接添加本机的共享资源,并为它设置相应权限。

5.停止共享:通过它可停止列表中指定资源的共享。

6.显示用户:这相当于选“查看”菜单中的“按连接”项,它是“网络监视器”主窗口的默认状态,也是最常用的窗口。此处可以查看到已连接到本机的客户机的用户名、计算机名、打开了些什么共享资源、打开些什么文件以及连接的时间和空闲的时间等资料。当客户机断开连接之后它就会自动从此列表中消失。

7.显示共享的文件夹:这相当于选“查看”菜单中的“按共享的文件夹”项。它可以查看本机已共享的资源及其共享名和权限;可添加共享,停止共享,修改共享等。

8、显示文件:这相关于选“查看”菜单中的“按打开的文件”项。它可以查看已打开的本服务器文件;可关闭文件等。

三、“网络监视器”的远程监视

本文上面部分已经讲过“网络监视器”在本地计算机上的基本使用方法,但实际上在一定条件满足的情况下,它也可以对局域网内的其他计算机进行完全相同的远程管理。请进行如下的操作:

1.启用远程管理

在远程计算机上,先进入其“控制面板→密码→远程管理”窗口,再勾选中“启用此服务器的远程管理”,接着在相应位置输入密码后按“确定”按钮保存退出。

2.使用远程管理

在本地计算机上,先进入“网络监视器”的主窗口,再选“管理员”菜单中的“选择服务器”项,在“请输入要进行管理的服务器名”的提示窗口中的“名称”处输入远程计算机的名字(比如为zhuyan),然后按“确定”按钮继续;系统接着会提示“必须提供密码才能连接”,则请在“密码”后输入“启用远程管理”一步中所设的密码值,最后按“确定”按钮即可得到新的“网络监视器”的窗口,里面当然是远程计算机的共享内容了,你所要做的,就是进行正常操作就可以啦!

注意:

1.如果在“使用远程管理”操作中,当进行到输入密码一步勾选中了“请将密码保存到密码列表”项,则当你以后再连接到远程计算机时就不用输入密码了。

2.如果要想修改共享文件夹名或其权限设置,则需要在“显示共享的文件夹”窗口中,先在列表中选中该用户,然后按键盘上的ALT+ENTER键(或者选“管理员”菜单中的“共享文件夹的属性”项),再根据提示进行操作即可。

C语言中对fork,heap,stack,cpu time,stdout的监控,急求

只是帮你调好的程序代码,你想做什么没搞明白,不懂,希望对你有帮助

看注释,修改你的程序就好了

static int readStat(int pid, struct statStuff *s)

{

const char *format = "%d %d %ld ";

char buf[256];

FILE *proc;

sprintf(buf,"/proc/%d/stat",pid);

proc = fopen(buf,"r");

if (proc) {

if (3==fscanf(proc, format, s-pid, s-tpgid, s-cutime)) //ERR:42??%d %d %ld , 最后多一个逗号

{

fclose(proc);

return 1;

} else {

fprintf(stderr, "no data in file:%s\n" , buf );

fclose(proc);

return 0;

}

} else {

fprintf(stderr, "can't open %s\n",buf);

return 0;

}

}

static int readStatm(int pid, struct statmStuff *s)

{

const char *format = "%lu %lu";

char buf[256];

FILE *proc;

sprintf(buf,"/proc/%d/statm",pid);

proc = fopen(buf,"r");

if (proc) {

if (2==fscanf(proc, format, s-size, s-data) ) //ERR:7??? %lu %lu

{

fclose(proc);

return 1;

} else {

fprintf(stderr, "no data in file:%s\n" , buf );

fclose(proc);

return 0;

}

} else {

fprintf(stderr, "can't open %s\n",buf);

return 0;

}

}

int main()

{

int pid;

pid=fork();

if(pid==0) //ERR:==比较

{

execlp( "ls" , "ls" , "-l" , "/" ); //没有exec函数,不知道你的makefile干什么,这里举一个ls命令

}

else

while(1){

struct statStuff stat;

struct statmStuff statm;

if (readStat(pid,stat)) //ERR:ppid?

{

printf("stat is\n");

printStat(stdout,stat);

catStat(stdout,pid,"stat"); //ERR:ppid?

//pkill掉大于1cpu秒,fork超过10次及stdout多于50行的程序,输出给stderr

} else {

printf("didn't get stat\n");

}

if (readStatm(pid,statm)) //ERR:ppid?

{

printf("statm is\n");

printStatm(stdout,statm);

catStat(stdout,pid,"statm"); //ERR:ppid?

//处理heap或stack大于4096kb的程序,输出给stderr

} else {

printf("didn't get statm\n");

}

getchar();

}

return 0;

}

监控磁盘大小c语言

这篇文章主要介绍了C/C++ 监控磁盘与目录操作的示例,帮助大家更好的理解和学习C/C++编程,感兴趣的朋友可以了解下

遍历磁盘容量:

#include stdio.h

#include Windows.h

void GetDrivesType(const char* lpRootPathName)

{

UINT uDriverType = GetDriveType(lpRootPathName);

switch (uDriverType)

{

case DRIVE_UNKNOWN:puts("未知磁盘"); break;

case DRIVE_NO_ROOT_DIR: puts("路径无效"); break;

case DRIVE_REMOVABLE: puts("可移动磁盘"); break;

case DRIVE_FIXED: puts("固定磁盘"); break;

case DRIVE_REMOTE: puts("网络磁盘"); break;

case DRIVE_CDROM: puts("光驱"); break;

case DRIVE_RAMDISK: puts("内存映射盘"); break;

default: break;

}

}

void GetDrivesFreeSpace(const char* lpRootPathName)

{

unsigned long long available, total, free;

if (GetDiskFreeSpaceEx(lpRootPathName, (ULARGE_INTEGER*)available,

(ULARGE_INTEGER*)total, (ULARGE_INTEGER*)free))

{

printf("磁盘: %s | 总计: %lld MB 已用: %lld MB 剩余: %lld MB \n",

lpRootPathName, total 20, available 20, free 20);

}

}

int main(int argc,char *argv[])

{

DWORD dwSize = MAX_PATH;

char szLogicalDrives[MAX_PATH] = {0};

// 获取逻辑驱动器号字符串

DWORD dwResult = GetLogicalDriveStringsA(dwSize, szLogicalDrives);

if (dwResult 0 dwResult = MAX_PATH) {

char* szSingleDrive = szLogicalDrives; // 从缓冲区起始地址开始

while (*szSingleDrive) {

//printf("Drive: %s\n", szSingleDrive); // 输出单个驱动器的驱动器号

// GetDrivesType(szSingleDrive);

GetDrivesFreeSpace(szSingleDrive);

szSingleDrive += strlen(szSingleDrive) + 1; // 获取下一个驱动器地址

}

}

system("pause");

return 0;

}

遍历文件特定路径:

循环遍历文件路径,并将文件后缀为.exe的路径筛选出来.

#include stdio.h

#include windows.h

#include tlhelp32.h

void SearchFile(char *pszDirectory)

{

// 搜索指定类型文件

char *pszFileName = NULL;

char *pTempSrc = NULL;

WIN32_FIND_DATA FileData = { 0 };

// 申请动态内存

pszFileName = new char[2048];

pTempSrc = new char[2048];

// 构造搜索文件类型字符串 *.* 表示搜索所有文件类型

wsprintf(pszFileName, "%s\\*.*", pszDirectory);

HANDLE hFile = ::FindFirstFile(pszFileName, FileData);

if (INVALID_HANDLE_VALUE != hFile)

{

do

{

// 过滤掉当前目录"." 和上一层目录".."

if ('.' == FileData.cFileName[0])

continue;

// 拼接文件路径

wsprintf(pTempSrc, "%s\\%s", pszDirectory, FileData.cFileName);

// 判断是否是目录还是文件

if (FileData.dwFileAttributes FILE_ATTRIBUTE_DIRECTORY)

SearchFile(pTempSrc); // 如果是目录则继续递归

else

{

char drive[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT];

_splitpath(pTempSrc, drive, dir, fname, ext);

// 如果是文件并且后缀为.exe则输出具体路径

if (strcmp(ext, ".exe") == 0)

printf("%s \n", pTempSrc);

}

} while (::FindNextFile(hFile, FileData));

}

FindClose(hFile);

delete[]pTempSrc;

delete[]pszFileName;

}

int main(int argc, char * argv[])

{

SearchFile("c:\\MinGW7");

system("pause");

return 0;

}

监控文件目录变化:

#include stdio.h

#include windows.h

#include tlhelp32.h

UINT MonitorFileThreadProc(LPVOID lpVoid)

{

char *pszDirectory = (char *)lpVoid;

// 打开目录, 获取文件句柄

HANDLE hDirectory = CreateFile(pszDirectory, FILE_LIST_DIRECTORY, FILE_SHARE_READ | FILE_SHARE_WRITE,

NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);

if (INVALID_HANDLE_VALUE == hDirectory)

return 1;

char szFileName[MAX_PATH] = { 0 };

BOOL bRet = FALSE;

DWORD dwRet = 0;

DWORD dwBufferSize = 2048;

// 申请一个足够大的缓冲区

BYTE *pBuf = new BYTE[dwBufferSize];

if (NULL == pBuf)

return 2;

FILE_NOTIFY_INFORMATION *pFileNotifyInfo = (FILE_NOTIFY_INFORMATION *)pBuf;

// 开始循环设置监控

do

{

RtlZeroMemory(pFileNotifyInfo, dwBufferSize);

// 设置监控目录

bRet = ReadDirectoryChangesW(hDirectory, pFileNotifyInfo, dwBufferSize, TRUE,

FILE_NOTIFY_CHANGE_FILE_NAME | // 修改文件名

FILE_NOTIFY_CHANGE_ATTRIBUTES | // 修改文件属性

FILE_NOTIFY_CHANGE_LAST_WRITE, // 最后一次写入

dwRet, NULL, NULL);

if (FALSE == bRet)

break;

// 将宽字符转换成窄字符,宽字节字符串转多字节字符串

WideCharToMultiByte(CP_ACP, 0, (wchar_t *)(pFileNotifyInfo-FileName),

(pFileNotifyInfo-FileNameLength / 2),szFileName,MAX_PATH,NULL,NULL);

// 将路径与文件连接成完整文件路径

char FullFilePath[1024] = { 0 };

strncpy(FullFilePath, pszDirectory, strlen(pszDirectory));

strcat(FullFilePath, szFileName);

// 判断操作类型并显示

switch (pFileNotifyInfo-Action)

{

case FILE_ACTION_ADDED:

printf("文件被 [创建]: %s \n", FullFilePath); break;

case FILE_ACTION_REMOVED:

printf("文件被 [删除]: %s \n", FullFilePath); break;

case FILE_ACTION_MODIFIED:

printf("文件被 [修改]: %s \n", FullFilePath); break;

case FILE_ACTION_RENAMED_OLD_NAME:

printf("文件被 [重命名]: %s \n", FullFilePath); break;

}

} while (bRet);

CloseHandle(hDirectory);

delete[] pBuf;

pBuf = NULL;

return 0;

}

int main(int argc, char * argv[])

{

char *pszDirectory = "C:\\";

// 创建线程开始监控

CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MonitorFileThreadProc, pszDirectory, 0, NULL);

while (1)

{

Sleep(10000);

}

system("pause");

return 0;

}

监控目录文件变化:

可以将其改为一个简单的文件防篡改程序,也可以用来监控病毒的行为.

#include stdio.h

#include Windows.h

#include tlhelp32.h

DWORD WINAPI MonitorFileThreadProc(LPVOID lParam)

{

char *pszDirectory = (char *)lParam;

BOOL bRet = FALSE;

BYTE Buffer[1024] = { 0 };

FILE_NOTIFY_INFORMATION *pBuffer = (FILE_NOTIFY_INFORMATION *)Buffer;

DWORD dwByteReturn = 0;

HANDLE hFile = CreateFile(pszDirectory, FILE_LIST_DIRECTORY, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,

NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);

if (INVALID_HANDLE_VALUE == hFile)

return 1;

while (TRUE)

{

ZeroMemory(Buffer, sizeof(Buffer));

// 设置监控目录回调函数

bRet = ReadDirectoryChangesW(hFile,Buffer,sizeof(Buffer),TRUE,

FILE_NOTIFY_CHANGE_FILE_NAME | // 修改文件名

FILE_NOTIFY_CHANGE_ATTRIBUTES | // 修改文件属性

FILE_NOTIFY_CHANGE_LAST_WRITE, // 最后一次写入

dwByteReturn, NULL, NULL);

if (TRUE == bRet)

{

char szFileName[MAX_PATH] = { 0 };

// 将宽字符转换成窄字符,宽字节字符串转多字节字符串

WideCharToMultiByte(CP_ACP,0,pBuffer-FileName,(pBuffer-FileNameLength / 2),

szFileName,MAX_PATH,NULL,NULL);

// 将路径与文件连接成完整文件路径

char FullFilePath[1024] = { 0 };

strncpy(FullFilePath, pszDirectory, strlen(pszDirectory));

strcat(FullFilePath, szFileName);

switch (pBuffer-Action)

{

case FILE_ACTION_ADDED:

{

printf("添加: %s \n", FullFilePath); break;

}

case FILE_ACTION_REMOVED:

{

printf("删除: %s \n", FullFilePath); break;

}

case FILE_ACTION_MODIFIED:

{

printf("修改: %s \n", FullFilePath); break;

}

case FILE_ACTION_RENAMED_OLD_NAME:

{

printf("重命名: %s", szFileName);

if (0 != pBuffer-NextEntryOffset)

{

FILE_NOTIFY_INFORMATION *tmpBuffer = (FILE_NOTIFY_INFORMATION *)

((DWORD)pBuffer + pBuffer-NextEntryOffset);

switch (tmpBuffer-Action)

{

case FILE_ACTION_RENAMED_NEW_NAME:

{

ZeroMemory(szFileName, MAX_PATH);

WideCharToMultiByte(CP_ACP,0,tmpBuffer-FileName,

(tmpBuffer-FileNameLength / 2),

szFileName,MAX_PATH,NULL,NULL);

printf(" - %s \n", szFileName);

break;

}

}

}

break;

}

case FILE_ACTION_RENAMED_NEW_NAME:

{

printf("重命名(new): %s \n", FullFilePath); break;

}

}

}

}

CloseHandle(hFile);

return 0;

}

int main(int argc, char * argv[])

{

char *pszDirectory = "C:\\";

HANDLE hThread = CreateThread(NULL, 0, MonitorFileThreadProc, pszDirectory, 0, NULL);

WaitForSingleObject(hThread, INFINITE);

CloseHandle(hThread);

return 0;

}

以上就是C/C++ 监控磁盘与目录操作的示例的详细内容


分享标题:C语言文件监控函数 c语言键盘监控
URL分享:http://ybzwz.com/article/dospphh.html