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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用C语言监视一文件,(可以隔一定时间检测该文件),当文件相比较上一时间有改动时,读出改动处相关的知识,希望对你有一定的参考价值。

如何用C语言监视一文件,(可以隔一定时间检测该文件),当文件相比较上一时间有改动时,读出改动处。改动处都在文本后面进行添加。
文本内容为若干个“Sep 16 13:40:29 farm MGIR-AP[1989]:I am a sample!”日志信息。新的日志信息是追加在文本末尾的```
如何用select函数写呢

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

欲打开“网络监视器”,只需依次选择“开始→程序→附件→系统工具→网络监视器”即可进入其主窗口。
对于“网络监视器”中的功能,既可以选择菜单中的相应项目,也可以通过直接单击工具栏上的相应按钮来实现。在其主窗口工具栏上的按钮,从左到右作用依次为:
1.选择服务器:通过它可对其他计算机的“网络监视器”进行远程管理。具体的使用方法请参见后文相关内容。
2.断开用户连接:通过它可强行中断列表中指定用户对本机的连接。
3.关闭文件:通过它可强行关闭列表中指定用户所打开的指定共享文件。
4.添加共享:通过它可根据提示直接添加本机的共享资源,并为它设置相应权限。
5.停止共享:通过它可停止列表中指定资源的共享。
6.显示用户:这相当于选“查看”菜单中的“按连接”项,它是“网络监视器”主窗口的默认状态,也是最常用的窗口。此处可以查看到已连接到本机的客户机的用户名、计算机名、打开了些什么共享资源、打开些什么文件以及连接的时间和空闲的时间等资料。当客户机断开连接之后它就会自动从此列表中消失。
7.显示共享的文件夹:这相当于选“查看”菜单中的“按共享的文件夹”项。它可以查看本机已共享的资源及其共享名和权限;可添加共享,停止共享,修改共享等。
8、显示文件:这相关于选“查看”菜单中的“按打开的文件”项。它可以查看已打开的本服务器文件;可关闭文件等。

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

本文上面部分已经讲过“网络监视器”在本地计算机上的基本使用方法,但实际上在一定条件满足的情况下,它也可以对局域网内的其他计算机进行完全相同的远程管理。请进行如下的操作:
1.启用远程管理
在远程计算机上,先进入其“控制面板→密码→远程管理”窗口,再勾选中“启用此服务器的远程管理”,接着在相应位置输入密码后按“确定”按钮保存退出。
2.使用远程管理
在本地计算机上,先进入“网络监视器”的主窗口,再选“管理员”菜单中的“选择服务器”项,在“请输入要进行管理的服务器名”的提示窗口中的“名称”处输入远程计算机的名字(比如为zhuyan),然后按“确定”按钮继续;系统接着会提示“必须提供密码才能连接”,则请在“密码”后输入“启用远程管理”一步中所设的密码值,最后按“确定”按钮即可得到新的“网络监视器”的窗口,里面当然是远程计算机的共享内容了,你所要做的,就是进行正常操作就可以啦!

注意:
1.如果在“使用远程管理”操作中,当进行到输入密码一步勾选中了“请将密码保存到密码列表”项,则当你以后再连接到远程计算机时就不用输入密码了。
2.如果要想修改共享文件夹名或其权限设置,则需要在“显示共享的文件夹”窗口中,先在列表中选中该用户,然后按键盘上的ALT+ENTER键(或者选“管理员”菜单中的“共享文件夹的属性”项),再根据提示进行操作即可。
参考技术A 有一个函数叫FindFirstChangeNotification,可以监控文件属性的变化。当然你也可以定时来读取文件的属性。察觉到变化后,将文件指针移动到上次读取的末尾处,读取最新的内容。 参考技术B 一个伪代码,给你一个思路
FILE *fp;
long len=0,lastlen=0;
while(1)
隔一定时间
fp=fopen("a.txt","r");
len=ftell(fp);//可以返回文件长度
if(len>lastlen)
fseek(SEEK_SET,lastlen);//定位到上一次改动前的地方
char buf[len-lastlen];
fread(buf,1,len-lastlen,fp);//把改动处读到内存中
lastlen=len;
//if
fclose(fp);
//while

用select写什么?追问

用select()来实现不断监视数据```
还有,使用fread读取数据到buf中后,如何再从buf中读出来,放到一个数组中去!并且,从数组中一个元素这样读出来```
我是个绝对的菜鸟,请指教呀!

追答

使用fread读取数据到buf中后 直接写入文件就行了,不用再放数组里,buf本身就是数组
用select()来实现不断监视数据这个我还是没明白,不是隔一定的时间就去监视一下吗,那用select想做什么?

追问

使用fread读的就是文件,读到buf中后,要对buf保存的数据进行解析,根据‘\n’解析为一句一句的,另外保存在一个数组中。
而select()是为了一直监视文件,当文件内容有更新时,就立即能响应```
主要是前面的fread那有些难理解

追答

select是无法检查某文件是不是更新了,select只能检查出描述符可读、写、异常的事件
另外,对文件的读也不一定非要一行一行的来,你需要的是把读出来的原模原样的写入文件不是吗

本回答被提问者采纳

如何用高级语言对操作系统进行编码?

我刚刚开始涉足操作系统领域,并且我了解到进程具有一定的内存空间,它们可以处理这些内存空间,这些内存空间由操作系统处理。我不太了解用c和c ++等高级语言编写的操作系统如何获得这种内存管理功能。

答案

您已经捕获了该错误,并且无法治愈:-)

您用于编写操作系统的语言与操作系统的运行方式几乎没有关系。是的,大多数人使用C / C ++,但还有其他人。至于语言,您确实需要一种可以让您直接与计划管理的硬件进行通信的语言,而组装是该部分的主要选择。但是,这还不到整个项目的5%。

您编写的代码不得依赖任何现有操作系统。即:您必须自己编写所有函数的代码,或调用现有的库。但是,必须编写这些现有库,以使它们不依赖任何其他内容。

一旦有了基础,就可以用您选择的任何语言来编写操作系统,而汇编中的次要部分是高级语言所不允许的。实际上,在64位代码中,某些编译器不再允许行内汇编,因此这使我上面提到的5%更像是15%。

找出您想做的事,然后找出是否可以用选择的语言来完成。例如,主要的操作系统组件可以用C编写,而实际的处理器管理(中断等)必须在汇编中完成。您的引导代码也必须是汇编的,至少其中大多数是汇编的。

作为mentioned in a different post,我有一些您可能想看的early example code。引导是通过汇编完成的,而传统的BIOS和EFI加载程序代码大多是C代码。

另一答案

为了阐明fysnet的答案,您必须至少使用一些汇编程序的原因是,您只能在C / C ++中(通过指针)显式访问可寻址内存,而硬件寄存器(例如程序计数器或堆栈指针)通常没有内存地址。不仅如此,而且某些寄存器还必须使用依赖于CPU体系结构的特殊指令来操作,而且这也只能用机器语言来实现。

我不太了解用c和c ++等高级语言编写的操作系统如何获得这种内存管理功能。

如上所述,根据体系结构,这可以通过具有管理MMU,TLB等的特殊指令来实现。INVLPG是x86体系结构中此类指令的一个示例。请注意,拥有一条需要内核特权的特殊指令可能是在硬件中以安全方式实现此功能的最简单方法,因为这足以检查CPU是否处于内核模式,以确定该指令是否可以被执行。是否执行。

另一答案

编译器会为您将高级语言转换为asm /机器代码,因此您不必自己编写asm。您选择了一种可以按您希望的操作系统处理内存的编译器。例如使用调用堆栈进行自动存储,而不是隐式调用malloc / free(因为那些在内核中将不存在)。

要将编译后的C / C ++链接到内核,通常必须了解有关它所针对的ABI以及工具链(尤其是链接器)的更多信息。

ISO C标准将实现细节视作黑匣子。但是人们使用的低级东西的实际编译器以内核程序员所依赖的众所周知的方式工作(即做出预期的/有用的实现选择),就将代码和静态数据编译为可以链接为单个块的连续块而言内核可执行文件,可以全部加载为一个块。


关于实际管理系统的内存,您可以自己编写代码来做到这一点,并在必要时使用一些内联汇编,以用于诸如invlpg之类的特殊指令,以及其他答案。]

入口点(执行开始的地方,通常将以纯asm格式编写)

,以建立带有指向它的堆栈指针寄存器的调用栈。并设置虚拟内存等,以便可执行代码,读取/写入数据以及读取只读数据。在跳转到任何已编译的C代码之前,所有这些都必须要做。您跳到的第一个C可能是更多的内核初始化代码,例如初始化数据结构以供分配器管理静态代码/数据尚未使用的所有内存。

创建堆栈并将代码/数据映射到内存是一种通常在启动用户空间程序时由操作系统by

完成的设置。编译器发出的汇编将假定代码,静态数据和堆栈都已经存在。

以上是关于如何用C语言监视一文件,(可以隔一定时间检测该文件),当文件相比较上一时间有改动时,读出改动处的主要内容,如果未能解决你的问题,请参考以下文章

如何用C语言检测网络是不是连接上、已连接、已断开状态

如何用C语言播放一段音频呢

在ubuntu系统中如何用GCC编译运行一个C程序?

如何用高级语言对操作系统进行编码?

dll文件如何用C语言生成

如何用c语言插入(背景)音乐