Linux C将缓冲区写入来自while循环问题的文件

时间:2014-02-05 09:44:07

标签: c linux

我有以下功能(转储进程内存区域)。如果我写入stdout write(STDOUT_FILENO, buf, rd);它会正确输出缓冲区,当我想将缓冲区写入文件时,问题就会出现,文件会被写入但是反复使用相同的日期:

void dump_region(int fd, off64_t start, off64_t end)
{
        char buf[4096];
        int fdo;

        fdo = open("memdump_log", O_WRONLY | O_CREAT, 0644);
        if (fdo == -1) {
                fprintf(stderr, "open failed: %m\n");
                close(fd);
                exit(1);
        }

        lseek64(fd, start, SEEK_SET);
        while(start < end) {
                int rd;

                rd = read(fd, buf, 4096);
                write(fdo, buf, rd);
                //write(STDOUT_FILENO, buf, rd);
                start += 4096;
        }
        close(fdo);
}

可以从main()访问该功能,如下所示:

if(maps && mem != -1) {
        char buf[BUFSIZ + 1];

        while(fgets(buf, BUFSIZ, maps)) {
                off64_t start, end;

                sscanf(buf, "%llx-%llx", &start, &end);
                dump_region(mem, start, end);
        }
}

知道我哪里错了吗?

3 个答案:

答案 0 :(得分:3)

修改

    fdo = open("memdump_log", O_WRONLY | O_CREAT, 0644);

    fdo = open("memdump_log", O_WRONLY | O_CREAT | O_APPEND, 0644);

答案 1 :(得分:2)

您需要搜索输出文件的末尾,或将O_APPEND传递给打开

答案 2 :(得分:2)

每次调用dump_region时都会继续重新打开输出文件。打开文件时,它始终会在开始时写入。保持文件始终打开,搜索到最后,或尝试O_APPEND标志。