【问题标题】:Why is this kernel function going to infinite loop?为什么这个核函数会无限循环?
【发布时间】:2012-10-26 00:51:43
【问题描述】:

我正在尝试在内核系统调用中覆盖文件中的所有数据(是的,我知道我不应该在内核中读取/写入文件,但我只是在尝试!)基于此处的答案How to read/write files within a Linux kernel module?

代码如下:

int sys_mycompleteerase(const char __user * inputFileUser)  {

    struct file* filp = NULL;   
    int err = 0,count = 0;
    unsigned long long offset =0;

    mm_segment_t old_fs;
    old_fs = get_fs();
    set_fs(KERNEL_DS);

    filp = filp_open(inputFileUser, O_WRONLY, 0644);
    if(IS_ERR(filp)) {
        err = PTR_ERR(filp);
        return NULL;
    }
    do {
        count = vfs_write(filp," ",sizeof(" "), &offset);
        offset+=sizeof(" ");
    }while(count > 0);
    filp_close(filp, NULL);

    set_fs(old_fs);

    return 0;

}

如果我在用户空间程序中给了一个正确的文件名,它就会不停地写下去。为什么?

【问题讨论】:

  • 仅供参考:sizeof(" ") 是 2,而不是 1(它计算空终止符)。
  • 你怎么知道什么时候停止? count 是你写出的字节数,大于 0,直到你用完磁盘空间。你需要一个更好的终止条件。

标签: c linux file-io kernel


【解决方案1】:

您似乎在不断地写入文件,因此文件长度正在增长。 vfs_write 没有理由失败。如果我理解正确,您想要做的是覆盖整个文件。因此,您必须首先找到文件的大小,然后将那么多字节写入文件,然后关闭文件。就目前而言,您只是在使用“空格”字符来扩展文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 2020-04-02
    • 2020-08-08
    • 1970-01-01
    • 2011-12-08
    • 2012-09-27
    相关资源
    最近更新 更多