Python 用C语言监视日志文件
使用python,我有一个守护进程以以下方式监视日志文件:Python 用C语言监视日志文件,python,c,file,loops,logfile,Python,C,File,Loops,Logfile,使用python,我有一个守护进程以以下方式监视日志文件: f = open(r'logfile.log', 'r') while True: line = f.readline() if not line: time.sleep(1) else: # do something 问题是,如果用C编写“do something”部分,它的执行速度会快得多。因此,我想用C编写同样的操作。如何用C编写跟踪日志文件的类似方法 下面只是获取整个文件,并对每
f = open(r'logfile.log', 'r')
while True:
line = f.readline()
if not line:
time.sleep(1)
else:
# do something
问题是,如果用C编写“do something”部分,它的执行速度会快得多。因此,我想用C编写同样的操作。如何用C编写跟踪日志文件的类似方法
下面只是获取整个文件,并对每行执行“某些操作”。相反,我只想在日志文件中添加新行来“做点什么”:
谢谢 您可以使用
fseek
功能跳到文件中的特定偏移量。为了避免跳过Python代码检测到的新行,Python中的部分应该将seek偏移量传递给C代码。(最好的方法取决于如何调用C代码.)
您可以尝试以下代码:
#include <stdio.h>
int main()
{
mkfifo("tmpFifo");
if(fork()==0)//to avoid the main program getting stuck at system()..
{
system("tail -f logfile.txt > tmpFifo");
exit(0);
}
int fd = open("tmpFifo", O_RDONLY);
char buff[1000];//set some length depending on the maximum string that gets
//appended...
int n;
while((n=read(fd, buff, 1000))>0)
{
//do something... where 'n' stores the number of chars read...
}
close(fd);
rm("tmpFifo");
return 0;
}
#包括
int main()
{
mkfifo(“tmpFifo”);
if(fork()==0)//为了避免主程序卡在system()上。。
{
系统(“tail-f logfile.txt>tmpFifo”);
出口(0);
}
int fd=打开(“tmpFifo”,仅限Ordu);
char buff[1000];//根据获取的最大字符串设置一些长度
//附加。。。
int n;
而((n=read(fd,buff,1000))>0)
{
//做点什么…其中'n'存储读取的字符数。。。
}
关闭(fd);
rm(“tmpFifo”);
返回0;
}
如果您想编写代码而不是使用
tail-f
,可能会有所帮助。但是,我想这是最简单的解决方案。我最初的回答是:“在类似POSIX的系统上,您可以使用select()
来“监视”打开的文件描述符,以查看是否有更多的输入可用。这可能是在任何Unix/Linux系统上执行此操作的标准方式。”
我在套接字和管道上使用了select()
,并假设它只会在有更多可用数据时返回,但这可能只是表面的直觉,实际上并非如此:select()
被定义为在后续read()
(或write()
)不会阻塞时返回,这是另一回事,因为read()
可以读取零字节而不是块
普通文件总是read()
-可读取的,即使在文件末尾也是如此。如果尝试使用select()
跟踪日志文件,select()
从不阻塞,后续的read()
为零长度。简言之,你最终会忙着等待。将源代码读取到任何tail
实现,或者读取将确认这一点
我想我应该把这个留在这里,以防万一其他人也会犯同样的错误。什么是“做点什么”呢?@Blender并不重要。想象一下,它使用套接字,发送shtuff,调用一个运行速度比python/perl/bash:)快300倍的函数,您可以在打开文件后查找到文件末尾。你想用C语言还是Python语言来做这件事?@joni in C:)我怎么能不漏掉更多的行呢?设想一个log4j进程编写一个日志文件。我希望跟踪该文件,并使用新添加的行执行操作当日志文件没有短暂更新时,您的
C
代码将退出,而您的Python代码将继续查找。您需要一个while(1)
loop.Willsystem(“tail-f logfile.txt>tmpFifo”)代码>偶数返回?调用的文档中说,“在命令完成后返回”,但是tail-f
不会完成,除非它从某处接收到终止信号。感谢您指出这一点。相应地更新了答案。。。编辑:也可以使用exec
调用。为了简单起见,我仍然更喜欢使用system()
。
long seek_offset = /* get offset from Python side */
fseek(fr, seek_offset, SEEK_SET);
#include <stdio.h>
int main()
{
mkfifo("tmpFifo");
if(fork()==0)//to avoid the main program getting stuck at system()..
{
system("tail -f logfile.txt > tmpFifo");
exit(0);
}
int fd = open("tmpFifo", O_RDONLY);
char buff[1000];//set some length depending on the maximum string that gets
//appended...
int n;
while((n=read(fd, buff, 1000))>0)
{
//do something... where 'n' stores the number of chars read...
}
close(fd);
rm("tmpFifo");
return 0;
}