程序不将数组写入文件

时间:2018-10-23 09:14:48

标签: c

我在Ubuntu上写入文件时遇到问题。我想创建大小为4MB的文件,因此将写入1024个大小为4096字节的块。程序在桌面上创建一个文件,但是当我打开它时,它的大小为0字节,为空。文件可以打开,写返回值-1。 errno说参数无效。

代码:

float timedifference_msec(struct timeval t0, struct timeval t1)
{
    return (t1.tv_sec - t0.tv_sec) * 1000.0f + (t1.tv_usec - t0.tv_usec) / 1000.0f;
}

int main(void)
{
    struct timeval t0, t1;
    float elapsed;
    struct timespec start1, end1;
    char c_array [4096];
    int i = 0;
    int j = 0;

    int fdw = open("/home/user/Desktop/xxxy.txt", O_CREAT |O_WRONLY |O_DIRECT, 0644);

    for(i=0; i<4096; i++){
        c_array[i] = '0';
    }

    for(j=0; j<1024; j++){
        gettimeofday(&t0, 0);
        unsigned long start =
            std::chrono::duration_cast<std::chrono::milliseconds>
            (std::chrono::system_clock::now().time_since_epoch()).count();

        write(fdw, c_array, 4096);
        fsync(fdw);
        gettimeofday(&t1, 0);
        unsigned long end =
            std::chrono::duration_cast<std::chrono::milliseconds>
            (std::chrono::system_clock::now().time_since_epoch()).count();
        elapsed = timedifference_msec(t0, t1);
        printf("%d - Elapsed time: %f : %f\n", j, elapsed, end-start);
    }

    close(fdw);

    return 0;
} 

//具有O_DIRECT的方法

void *buf;
posix_memalign(&buf, 4096, 4096);

int fdw = open("/home/user/Desktop/xx1.txt", O_CREAT |O_WRONLY| O_TRUNC|O_DIRECT, S_IRWXU);     
for(i=0; i<4096; i++){
    c_array[i] = '9';
} 

memcpy(buf, c_array, sizeof(c_array)); 

for(i=0; i<512; i++){
    gettimeofday(&t0, 0);     
    write(fdw, buf, 4096);
    fsync(fdw);   
    gettimeofday(&t1, 0);    
    elapsed = timedifference_msec(t0, t1);    
    printf("%3d - Elapsed time: %f milliseconds.\n", i, elapsed);     
} 

close(fdw);
free(buf);

1 个答案:

答案 0 :(得分:2)

好的,所以您说write调用失败,并出现errno为“无效参数”,即EINVAL。在发布的代码中,您实际上并没有观察到这一点,但是为了进行论证,假设您实际上正在运行一个与检查errno相同的程序。

The manpage for write清楚地说:

  

EINVAL
  fd附加到不适合写的对象上;或使用O_DIRECT标志打开文件,并且buf中指定的地址,count中指定的值或文件偏移未正确对齐。

除非您知道自己在做什么以及为什么,否则不要使用O_DIRECT。去掉它。并阅读文档!