Articles of 文件 io

RCHAR是否包含READ_BYTES(proc / <pid> / io)?

我读取proc/<pid>/io来度量SQL查询的IO活动,其中<pid>是数据库服务器的PID。 我读取每个查询之前和之后的值来计算差异,并获取请求导致读取和/或写入的字节数。 据我所知,字段READ_BYTES计算实际的磁盘IO,而RCHAR包含更多,如linux页面caching可以满足的读取(请参阅理解/ proc / [pid] / io中的计数器以进行说明)。 这导致了一个假设, RCHAR应该得出一个等于或大于READ_BYTES的值,但是我的结果与这个假设相矛盾。 我可以想象一些小块或页面开销为Infobright ICE(值是MB)的结果: Query RCHAR READ_BYTES tpch_q01.sql| 34.44180| 34.89453| tpch_q02.sql| 2.89191| 3.64453| tpch_q03.sql| 32.58994| 33.19531| tpch_q04.sql| 17.78325| 18.27344| 但是我完全无法理解MonetDB的IO计数器(值是MB): Query RCHAR READ_BYTES tpch_q01.sql| 0.07501| 220.58203| tpch_q02.sql| 1.37840| 18.16016| tpch_q03.sql| 0.08272| 162.38281| tpch_q04.sql| 0.06604| 83.25391| 我错误的假设, RCHAR包括READ_BYTES ? 有没有办法欺骗内核计数器,MonetDB可以使用? 这里发生了什么? 我可能会添加,我清除页面caching,并在每个查询之前重新启动数据库服务器。 我在Ubuntu 11.10上运行内核3.0.0-15-generic。

在C ++中的缓冲区大小

我正在观察C ++ Std库方法std :: ostream :: write()的以下行为。 为了缓冲我使用以下C ++ API的数据 std::ofstream::rdbuf()->pubsetbuf(char* s, streamsize n) 这工作正常(使用strace实用程序进行validation),只要我们在文件stream上使用的数据大小(数据大小) std::ofstream::write (const char* s, datasize n) 小于1023字节(低于此值时,写入会累积,直到缓冲区未满),但当要写入的数据大小超过1023时,不考虑缓冲区,并将数据刷新到文件。 例如,如果我将缓冲区大小设置为10KB,并且每次写入大约512字节,则strace将显示多个写入已合并为单个写入 writev(3, [{"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"…, 9728}, {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"…, 512}], 2) = 10240 ( 10 KB ) writev(3, [{"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"…, 9728}, {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"…, 512}], 2) = 10240 … 但是当我一次写入1024个字节的时候(保持缓冲区固定为10KB),现在strace向我展示了它没有使用缓冲区,并且每个stream :: write调用都被转换为写入系统调用。 writev(3, [{NULL, 0}, {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"…, 1024}], 2) = 1024 […]

寻找一种方法来强制在Linux中进行简短的阅读

我正在寻找在linux中产生短读取的方法,所以我可以unit testing他们周围的处理代码。 我有一些方法,在较低的层次调用pread / pread64从文件系统中的文件读取。 这些devise用于处理发生短读取的情况(读取的字节数小于请求的数量)。 我已经看到发生短读取的情况(跨networking文件系统)。 理想情况下,我将能够创build一个文件,允许读取N个字节,然后短时间读取M个字节,然后按预期正常读取。 这将允许unit testing指向文件/文件系统。 谢谢!

/ proc伪文件的打开/closures策略

我写了一个Linux的C实用程序,它每秒检查一次/ proc / net / dev的内容。 我使用fopen(“/ proc / net / dev”,“r”)打开文件,然后在完成时打开fclose()。 由于我使用的是“伪”文件,而不是真正的文件,每次读取文件时是否打开/closures文件,或者应该在应用程序启动时打开文件并保持全部打开? 该实用程序作为守护进程启动,因此可能会运行很长时间。

处理不完整的write()调用

在Linux / Unix中,write()调用可能最终写入比请求更less的字节: 例如,如果底层物理介质上的空间不足,或遇到RLIMIT_FSIZE资源限制(请参见setrlimit(2)),或者在调用被信号处理程序中断后,写入的字节数可能会小于计数写入less于计数字节。 (另请参见pipe道(7))。 C标准库的fwrite()具有相同的行为。 我所看到的大多数代码忽略了这种可能性,select以下列方式处理错误: int ret = write(fd, buf, size); if (ret < 0) { printf("Couldn't write %s: %s\n", path, strerror(errno)); exit(1); } 我亲自养成了修改条件的习惯,以便我们检查 if (ret != size) { printf("Couldn't write %s: %s\n", path, strerror(errno)); exit(1); } 其中注意到这种情况。 不过,我也注意到我的程序偶尔退出: Couldn't write /some/file: Success 我想这不是太奇怪。 但是,处理这种情况的标准,健壮,干净的方法是什么? 显然,“沉默的数据损坏” – 这似乎是每个教程的行为 – 是不行的。 我可以修改我的代码,以便专门检测这种情况并退出。 但是man […]

c标准输出到标准input实时

我已经做了两个程序之一名为发电机每秒钟打印一些文字 int main(int argc, char** argv) { for(int i = 0; i < 10 ; i++) { printf("something\n"); sleep(1); } return (EXIT_SUCCESS); } 那么现在有一个第二个程序调用它的消费者,它应该从一个标准input中读取一些其他文本并将其重新打印。 让它看起来像这样: int main(int argc, char** argv) { char line[BUFSIZ]; while(scanf("%s",line) != -1){ printf("you entered %s \n",line); } return (EXIT_SUCCESS); } 当我编译它们,并尝试只运行一个像./generator这样的发电机,就像我期望的那样工作。 每秒钟都会打印到控制台。 但是当我尝试运行它们都像./generator | ./消费者没有按照我的预期工作。 我等了10秒钟,之后有10行input了我想要打印的内容,“你每秒input一次”。 你能解释一下为什么这样,甚至更好地告诉我如何达到预期的行为。

如何追加到C文件,在Linux上使用O_APPEND模式打开?

这是家庭作业的一部分。 那么,我不能在我的作业中工作,所以我已经拉出了一个片段,并开始玩弄它,以弄清楚什么是错的。 在Linux中在C我想打开/创build一个文本文件,写一些东西,closures它,以读/写和追加模式打开它,然后追加任何东西到它的末尾(在这个例子中,string“,伙计”)。 尽pipe如此,写入方法也没有引发任何错误。 我不确定发生了什么事 代码如下: #include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <errno.h> #define BUFFSIZE 4096 int main(){ mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; int fd = open("tempfile.txt", O_RDWR | O_CREAT, mode); char buf[BUFFSIZE] = {'t', 'h', 'y', ' ', […]

防止重复使用文件描述符

无论如何,在Linux(或者更一般的POSIX操作系统)中,确保在程序执行过程中,即使文件closures,另一个文件被打开,文件描述符也不会被重用。 我的理解是,这种情况通常会导致closures文件的文件描述符被重新分配给新打开的文件。 我正在做一个I / O跟踪项目,如果我可以假设在open()/ fopen()调用之后,那个文件描述符的所有后续I / O都是同一个文件,那么这会使生活更简单。 我将采取编译时或运行时解决scheme。 如果不可能的话,当我处理跟踪文件(注意所有打开和closures的调用的位置)时,我可以做我自己的会计,但是我希望在执行跟踪的程序期间压缩问题。

Linux,取消阻塞read()

在用于串行通信的multithreadingLinux程序中,是否有可能(以及什么是最好的方法)终止来自另一个线程的阻塞read()调用? 我想尽可能保持一切尽可能的反应,并避免重复轮询使用超时。 这个问题的背景是,我正在尝试使用JNI为Linux创build一个Scala串行通信库。 我试图保持本地方尽可能简单,其中包括一个read()和close()函数。 在Scala方面,一个线程会调用read()并阻塞,直到来自串口的数据可用。 但是,串口可以通过其他方式closures,导致closures()的调用。 现在,为了释放被阻塞的线程,我不知何故需要取消系统读取调用。

最快的方式来计算目录大小

什么是最好和最快的方式来计算目录大小? 例如,我们将有以下结构: /users /a /b /c /… 我们需要输出为每个用户目录: a = 1224KB b = 3533KB c = 3324KB … 我们计划在/ users下拥有数十甚至数十万个目录。 以下shell命令的作用: du -cms /users/a | grep total | awk '{print $1}' 但是,我们必须调用它N次。 整个点,就是输出; 每个用户的目录大小将被存储在我们的数据库中。 另外,我们希望尽可能频繁地更新,但不要阻塞服务器上的所有资源。 是否有可能每分钟计算一次用户目录大小? 每5分钟一次? 现在我正在考虑一下,使用node.js有意义吗? 这样,我们可以计算目录大小,甚至可以在一个事务中插入到数据库中。 我们可以在PHP和Python中做到这一点,但不知道它是如此之快。 谢谢。