Articles of 文件 io

Windows在单独的线程上重叠了IO与IO

在Windows上,当你做I / O时,你可以使用OVERLAPPED选项来进行asynchronous。 这样做与在另一个线程上同步执行I / O有什么区别吗? 如果是这样,哪个更好? 操作系统只是在asynchronous情况下产生一个单独的线程,或者只是将它排队在驱动程序线程和发送信号,而不是块等待? 谢谢!

在ofstream :: close()返回后,文件是否保证可以立即读取?

我需要我的代码(Linux上的C ++)调用第二个可执行文件,之前已经编写了第二个程序读取的输出文件。 天真的做法, std::ofstream out("myfile.txt"); // write output here out.close(); system("secondprogram myfile.txt"); 遭受潜在的竞争条件,即使out.close()已经执行,该文件不能立即被第二个程序读取? 如果是这样,解决这个问题的最佳做法是什么? 三个笔记: 如果这是文件系统相关的,我对ext3和tmpfs的行为感兴趣。 显然还有其他原因(文件权限等)为什么第二个程序可能无法打开文件; 我只是对比赛条件的潜力感兴趣。 上面例子中的硬编码文件名是为了简单; 实际上我使用mkstemp 。

覆盖文件没有损坏的文件的风险

所以经常我的应用程序想保存文件以后再加载。 最近因为崩溃而倒霉了,我想以这样一种方式编写操作,即保证有新的数据或原始数据,但不会有混乱。 我的第一个想法是做一些事情(保存一个名为example.dat的文件): 为目标目录提供一个唯一的文件名,例如example.dat.tmp 创build该文件并写入我的数据。 删除原始文件(example.dat) 重命名(“移动”)临时文件到原来的位置(example.dat.tmp – > example.dat)。 然后在加载时应用程序可以遵循以下规则: 如果没有“example.dat”而没有“example.dat.tmp”,首先运行/新build项目,这样就加载默认/新build文件。 如果“example.dat”没有“example.dat.tmp”,则加载example.dat(正常载入大小写) 如果存在“example.dat.tmp”,则为用户提供潜在恢复数据的机会。 如果还存在“example.dat”,则不要在没有明确的用户常量的情况下覆盖它。 但是,我做了一些小小的研究后发现,除了操作系统caching(我可以用文件刷新方法覆盖)之外,有些磁盘驱动器仍然可以在内部caching,甚至可能对操作系统说谎,因此4可以完成,写入不实际写入,如果系统closures,我已经丢失了我的数据… 我不确定磁盘问题实际上是由应用程序解决的,但是正确的事情上面的一般规则是? 我应该保留一个旧的文件恢复副本,以确保更长的时间,有关这些事情的指导方针是什么(例如,可接受的磁盘使用情况,用户应该select,放置这些文件的位置等)。 另外我应该如何避免潜在的冲突用户和其他程序“example.dat.tmp”。 我记得有时候从其他软件中看到“〜example.dat”,这是一个更好的约定吗?

如何closureswrite()系统调用的缓冲?

我曾经认为write()系统调用是无缓冲的, fwrite和fread用于缓冲IO。 不过,我写了一些简单的程序来确定在使用write()时仍然有一些缓冲。 我在套接字上使用write()和read() 。 由于缓冲,服务器不停地发送数据包时,客户端可能会滞后。 我不要那个。 我希望客户端必须在服务器发送更多logging之前消耗logging。 我怎样才能做到这一点,而不增加确认等networking负载! 我在linux上使用gcc server.c: #include <stdio.h> #include <errno.h> #include <sys/socket.h> #include <arpa/inet.h> #include <stdio.h> #include <netinet/in.h> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <netinet/tcp.h> int remote_rr_port=2000; // Server will send RR logs using connection on this port. char const *remote_server_ip="127.0.0.1"; int connFD_rr; static void startTcpServer(int *sd, […]

Popen得到新运行过程的PID

我想在后台运行一些应用程序,然后用pid杀死它。 pipe = IO.popen("firefox 'some_url' 2>&1 &") pipe.pid 这段代码启动Firefox并返回一些PID,但不幸的是它不是Firefox的PID。 pipe = IO.popen("firefox") pipe.pid 这段代码启动Firefox并返回一些PID,Firefox的PID。 有没有解决scheme来启动外部应用程序并获得其pid? 火狐只是例如它可以是任何其他应用程序。 我也尝试使用库:Open3和Open4,但似乎是相同的效果。 我也想知道'$!' bashvariables是很好的解决scheme吗? 在后台运行一些东西,阅读“$!”,你觉得怎么样?

读取和写入一个大文件,而不是一个小块的磁盘一次的缺点?

我主要在基于Windows和Windows CE的系统上工作,其中CreateFile , ReadFile和WriteFile是工作马,无论是在本地Win32域还是在托pipe的.Net域中。 到目前为止,我一直没有任何明显的问题写或读大块文件,而不是循环,直到处理几个较小的块。 我通常将IO工作委托给后台线程,在完成时通知我。 但是看看文件IO教程或“教科书示例”,我经常会发现“小块循环”,而没有解释为什么它被使用,而不是更明显(我敢说!)“一次完成”。 我有什么缺点,我没有明白? 澄清: 通过大文件,我比较了我的单块与多个块。 我提到的多个块的例子通常在Windows CE上有1024个字节的大小,在桌面上有10个大小。 我的大文件通常是二进制文件,如手机等相机的照片,大小顺序为2-10 MB。 换句话说,不接近1 GB。

如何在C / C ++中以编程方式读取Linux文件权限

我怎样才能以编程方式读取linux文件权限,而不是使用“ls”然后parsing结果。

如何停止我的Linux系统中的磁盘I / O的页面caching?

这里是我的系统基于Linux2.6.32.12: 1它包含20个占用大量usr cpu的进程2需要将数据以100M / s的速率写入磁盘,并且这些数据最近不会被使用。 我期望的是: 它可以稳定运行,磁盘I / O不会影响我的系统。 我的问题: 一开始,系统按我的想法运行。 但随着时间的推移,Linux会为磁盘I / Ocaching大量数据,导致物理内存减less。 最后,将没有足够的内存,那么Linux将交换进出我的进程。 这会导致很多CPU时间用于I / O的I / O问题。 我有什么尝试: 我试图通过“fsync”来解决这个问题,每次我写一个大块。但是物理内存在caching的同时还在递减。 如何停止页面caching在这里,对我来说是没用的 更多信息: 当Top显示免费46963m时,一切都很好,包括cpu%wa低,vmstat显示没有si左右。 当Top显示免费273m时,%wa是如此之高以至于影响我的进程,而vmstat显示了很多si等等。

ioread32后跟iowrite32没有给出相同的价值

我已经开始学习Linux设备驱动程序。 我正在做一些示例程序作为我学习的一部分。 为了理解内存映射IO,我写了下面的代码(这里只显示init)。 没有硬件映射在基地址。 static unsigned long base = 0xfed00000; unsigned long device_base=0; unsigned long virtual_base=0; static int __init sharedirqmodule_init(void) { u32 register1=0; u32 value=0x23456789; device_base=base; void *address=0; if(!request_mem_region(device_base,8,"device")) return -ENODEV; virtual_base = (unsigned long) ioremap(device_base, 8); address=(void *)virtual_base; printk(KERN_ERR "Sharedirq : Address value: %lx\n",address); iowrite32(value,address); wmb(); register1=(u32)ioread32(address); rmb(); printk(KERN_ERR "Shared irq :value: %d \n",register1); […]

一次性*级别* – 触发epoll():EPOLLONESHOT是否意味着EPOLLET?

是否可以在单触式水平触发模式下使用epoll ? search时找不到任何信息; 似乎每个人都使用边缘触发模式。