Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.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
C 仅磁盘写入,但iotop也显示读取_C_Linux_Io - Fatal编程技术网

C 仅磁盘写入,但iotop也显示读取

C 仅磁盘写入,但iotop也显示读取,c,linux,io,C,Linux,Io,我想了解以下问题: 一个进程在无限循环中只执行write sys调用。当我提到iotop时,我希望看到与该进程相关的非零写入速度和零读取速度。但iotop告诉我们读写可以相等(取决于单个写大小)。看看C代码: #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> #include <stdio.h> #define BUFS

我想了解以下问题:

一个进程在无限循环中只执行write sys调用。当我提到iotop时,我希望看到与该进程相关的非零写入速度和零读取速度。但iotop告诉我们读写可以相等(取决于单个写大小)。看看C代码:

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#define BUFSIZE 1000000

char buf[BUFSIZE];
const int write_size = 4000;

int main(){
  int fd;
  if ((fd = open("filename", O_RDWR | O_CREAT, 0666)) < 0){
    return -1;
  }
  ssize_t ret;
  while (1){
    ret = write(fd, buf, write_size);
    if (ret != write_size){
      return -1;
    }
  }
  return 0;
}
#包括
#包括
#包括
#包括
#包括
#定义bufsize1000000
字符buf[BUFSIZE];
常量int write_size=4000;
int main(){
int-fd;
如果((fd=open(“filename”,O|RDWR | O|u CREAT,0666))<0){
返回-1;
}
ssize_t ret;
而(1){
ret=写入(fd、buf、写入大小);
如果(ret!=写入大小){
返回-1;
}
}
返回0;
}
如果您为“写入大小”指定不同的值,您将在iotop中看到不同的读取速度。如果该值与上述代码中的值相同,iotop显示读取和写入相等

重要提示:
该问题仅在某些情况下出现:
-在运行代码之前,必须创建文件并填充数据(比如至少8GB)

操作系统配置:
Debian lenny,2TB磁盘(xfs和ext4都经过测试), 找到对应内核版本 Linux g-6 2.6.26-bpo.1-xen-amd64#1 SMP周一1月12日14:32:40 UTC 2009 x86_64 GNU/Linux

提前感谢您解开谜团,

Michal.

您正在打开一个包含数据的现有文件。 您正在覆盖它(无O_追加)。
因此,在写入X数据时,文件系统需要获取内容(=块),将写入内容放在上面,然后将块推回磁盘。

您以覆盖模式打开文件,但写入的块不是磁盘上块大小的倍数(4000而不是4096)。因此,该过程不时会刷新缓冲区,并且需要从磁盘读取一个块来弥补间隙


添加
O_TRUNC
以消除神秘感。请注意,该进程现在将在启动过程中挂起,因为删除8GB需要一些时间。

如果只想打开文件进行写入,请尝试使用O_WRONLY | O_CREAT打开该文件。它可能会解决这个问题,而且当您说在调用open()之前文件必须包含数据时,它看起来是合理的。

这个问题写得很好!我希望每一个新手都能写得这么好,在描述他们的问题时做到透彻。欢迎来到这个网站!