Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用C语言监视日志文件_Python_C_File_Loops_Logfile - Fatal编程技术网

Python 用C语言监视日志文件

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编写跟踪日志文件的类似方法 下面只是获取整个文件,并对每

使用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编写跟踪日志文件的类似方法

下面只是获取整个文件,并对每行执行“某些操作”。相反,我只想在日志文件中添加新行来“做点什么”:


谢谢

您可以使用
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.Will
system(“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;
}