Articles of 文件 io

如何在不重新启动守护进程的情况下读取和截断snmptrapd日志文件

我做了一个执行nagios检查的python脚本。 该脚本的function非常简单,它只是parsing一个日志,并匹配一些信息女巫用于构buildnagios检查输出。 该日志是一个snmptrapd日志logging从其他服务器的陷阱,并logging在/var/log/snmptrapd巫婆后,我只是parsing他们的脚本。 为了有最新的陷阱我每次读取后从Python删除日志。 为了保存信息,我做了一个cron作业,将日志的内容复制到另一个日志,时间间隔比nagios检查间隔小一点。 我不明白的是为什么日志增长这么多(我的意思是消息日志,我猜测1000倍以上的信息更小)。 从我在日志中看到的有很多像^@这样的特殊字符,我认为这是通过我从pyton操作文件的方式完成的,但是看到我已经有三个星期的经验我似乎无法弄清楚这个问题。 脚本代码如下: import sys, os, re validstring = "OK" filename = "/var/log/snmptrapd.log" if os.stat(filename)[6] == 0: print validstring sys.exit() else: f = open(filename,"r") sharestring = "" line1 = [] patte0 = re.compile("[0-9]+-[0-9]+-[0-9]+") patte2 = re.compile("NG: [a-zA-Z\s=0-9]+.*") for line in f: line1 = line.split(" ") if re.search(patte0,line1[0]): sharestring = sharestring […]

Linux设备驱动程序 – 如何在closures文件时取消阻止读取线程?

我正在尝试为Linux实现一个字符设备驱动程序,并遇到麻烦。 简而言之,写入设备的数据被缓冲以供读取。 当没有数据可用时,通过“wait_event_interruptible”读取块的调用。 由写入处理程序接收的数据调用“wake_up_interruptible”。 释放处理程序还调用“wake_up_interruptible”来解锁读取器,但设置一个标志来指示驱动程序正在释放。 从用户空间我有一个可执行文件,打开驱动程序通过“打开”,然后启动另一个线程。 主线程继续调用“读”。 按照预期,没有数据可用于读取和呼叫块。 另一个线程hibernate一秒钟(为主线程提供足够的时间来读取和阻塞),调用“closures”,然后再次调用“closures”。 第一个调用返回“0”,而第二个返回“-1”(如预期)。 然而,我的驱动程序的释放处理程序从来没有被调用,我不明白如何解锁我的阅读线程,而不明确发送信号或写入一些数据到设备。 我的理解是,当驱动程序的最后一个句柄closures,其释放处理程序被调用。 我试图实现我认为是标准的用户空间行为 – 阻止从文件读取的线程将变得畅通无阻,并在asynchronousclosures时接收文件结束返回值。 我是否对用户空间中的文件级读取/closures有正确的理解? 我有正确的设备驱动程序了解吗? 我错过了别的吗? 我看了“Linux设备驱动程序第三版”,并不能完全find这个问题的答案。 我也search了谷歌,但似乎无法find答案。 你可以提供任何帮助表示赞赏。 我的内核版本是3.0.15。

大文件读/写在C + +的性能问题

我正在开发一个关于Qt的应用程序。 在这个应用程序中,主线程是一个Web服务器。 另一个线程有时从大文件(250MB)读取数据,并将其写入输出文件(〜2GB)。 该线程对文件执行高I / O操作,而CPU Iowait大约为70%。 我的问题是,当写入文件时,Web服务器没有快速响应。 我所理解的是服务器的qt套接字(在Linux上)是由一个连接到poll或select事件系统的系统套接字来表示的。 所以Qt发送信号到我的应用程序只有轮询发射事件。 我认为,文件写入太大的io操作可能会阻止轮询系统,所以我的qt服务器不会收到套接字事件。 当线程完成写入数据时,一切正常。 文件的写法如下所示: while(dataToRead){ // context has the list of files to read and current step dataToRead = extractData(context, &pBuffer, &sizeBuf); fwrite (pBuffer, 1, sizeBuf, pOutFile); free(pBuffer); pBuffer = NULL; // usleep(100000); } 如果我添加rest与睡眠function,这有助于避免问题,但不完全如果我不使用一个足够大的睡眠。 但睡眠太大会破坏性能,而且我是尽快生成的文件。 我做错了什么? 尽可能快地读/写文件是安全的吗? 上述function是否强制睡眠? 但是我们怎么能知道好时光呢? 我正在使用英特尔酷睿i5 2500和标准硬盘驱动器Mint LMDE,Linux 3.2.0 64位。 编辑:重现问题的示例程序可以在这里find: […]

理解read()的问题

我无法理解这段代码: static int read_mem(int pm, u64 *map) { u64 aux = PAGE_SIZE * sizeof(*map); if (read(pm, map, aux) != aux) { pr_perror("Can't read pagemap file"); return -1; } 它实际上是从描述符pm读取一个内存页面,但我不明白为什么它使用一个U64作为缓冲区的地址。 我怎样才能得到已经阅读的内容? 我怎样才能打印出来或处理它?

将非标准字符写入Linux命令行

我遇到了一些问题。 为了做我正在尝试的,我需要能够input纯hex值到命令行的标准input(特别是在程序内部的gets()调用),而不使用IOredirect。 我通常使用ctrl + u +数字来input相当于input的hex值的ascii字符,但是我需要能够input空字符/退格/等,terminal要么忽略或解释为一个动作,而不是一个字符。 如果我使用pipe道或IOredirect,则在初始input和程序closures后无法与程序交互。 有没有人有任何想法? 我想可能的解决scheme是: find一种方法来手动input字符,并保留它们 find一种方法来input的字符不是Unicode或ASCII,但仍将被接受为字节信息 find一种方法来将inputredirect到从命令行解释的程序,然后以某种方式说服它将input的控制立即返回到命令行 第三个我什至不知道是可能的或有用的,因为我不完全确定为什么程序不工作,如果它从任何东西,但直接从命令行获取信息,我所知道的是,我必须手动input否则它不会运行。 有没有人有任何想法的3个选项,或任何其他你可以想到的? 我很难过 (哦,如果有人可以解释为什么有时Ctrl + U +数字输出与input数字完全不同的hex值的字符,我很好奇,但我不认为它会帮助我反正目前的问题。)

从命令行中从一个非常大的文件中select一个随机行

假设你有一个非常大的文件,那么通过所有的行,或者慢下来会是很昂贵的。 你将如何随机select一条线(最好是从命令行或Python)?

为什么使用write()将date写入磁盘会阻塞SIGALRM信号,直到写入结束?

#include <stdio.h> #include <signal.h> #include <fcntl.h> #include <stdlib.h> #define BUFSIZE 500*1024*1024 char buf[BUFSIZE]; static void sig_alrm(int signo) { printf("%d\n",time(NULL)); printf("caught SIGALRM\n"); fprintf(stderr, "in sig_alrm\n"); } int main() { int fd; fd=open("a.txt",O_WRONLY); signal(SIGALRM,sig_alrm); printf("%d\n",time(NULL)); alarm(1); write(fd,buf,BUFSIZE); } 输出: 1414899972 1414899976 caught SIGALRM in sig_alrm 看起来,SIGALRM在警报(1)的通话后约3秒钟被捕获。 为什么信号没有立即被捕获,系统调用重新启动?

文件deleteOnExit()函数保持参考指针打开,即使文件被删除后

我正在使用java.io.File.createTempFile()在我的应用程序中创build临时文件。 在创build文件时,我为该File对象调用了deleteOnExit() 。 此代码在我的应用程序的许多情况下使用。 有时,临时文件的大小太大,所以我必须在作业完成后立即删除它。 所以我打电话File.delete()的一些对象。 现在的问题是,当我使用delete()函数删除文件时,参考指针为这个被删除的文件打开(因为它是临时文件(我的意见))。 正因为如此,我面临内存泄漏问题。 (纠正我,如果我错了我的上述假设) 我在我的环境下面临着高磁盘利用率的问题,我发现“df”和“du”命令输出的差异超过30GB( 'df'查看FS本身的状态,而'du'忽略已删除的文件描述符 )。 如果我删除deleteOnExit(),我将不得不小心手动删除所有的对象。 这样做,我的指针仍然保持打开状态(在linux上使用lsof +al1来查看打开的文件)为什么会发生这种情况? 如果我删除了delete(),那么我将不得不等待虚拟机停止以删除tempFiles(这在生产服务器中是非常罕见的情况)。 ( 巨大的空间利用 ) 如果我手动删除文件,有什么解决scheme可以从deleteOnExit()列表中删除文件?

从gpioinput读取的字节数是零

当试图读取gpio输出引脚时,我有一些奇怪的行为。 我得到的第一次读取返回1(1字节读取),但接下来读取从相同的GPIO返回0.我会假设它应该总是读1,因为总是有东西要从input引脚读取。 gpio = 8; fd = open("/sys/class/gpio/export", O_WRONLY); sprintf(buf, "%d", gpio); rc = write(fd, buf, strlen(buf)); if (rc == -1) printf("failed in write 17\n"); close(fd); sprintf(buf, "/sys/class/gpio/gpio%d/direction", gpio); fd = open(buf, O_WRONLY); rc = write(fd, "in", 2); if (rc == -1) printf("failed in write 18\n"); close(fd); sprintf(buf, "/sys/class/gpio/gpio%d/value", gpio); gpio_tdo = open(buf, O_RDWR); rc […]

Python:文件写入仅在Linux上添加无意的换行符

我正在使用Python 2.7.9。 我正在处理一个程序,该程序应该在每个循环的.csv文件中生成以下输出: URL,number 这是我正在使用的代码的主循环: csvlist = open(listfile,'w') f = open(list, "r") def hasQuality(item): for quality in qualities: if quality in item: return True return False for line in f: line = line.split('\n') line = line[0] # print line itemname = urllib.unquote(line).decode('utf8') # print itemhash if hasQuality(itemname): try: looptime = time.time() url = baseUrl + […]