linux内核I / O.

时间:2015-03-02 03:23:35

标签: c linux linux-kernel

我正在尝试修改linux内核上的rm_dir命令。我想添加一个确认请求。类似于:“你确定要删除这个目录(Y / N):”

我在fs目录下找到了文件系统的实现(或至少我认为我有)。我认为必须有某种管理器来检查特定体系结构上使用的文件系统,然后调用适当的删除过程实现。但是,我找不到这样的“经理”功能。我发现的只有以下宏:

SYSCALL_DEFINE1(rmdir, const char __user *, pathname)
{
    return do_rmdir(AT_FDCWD, pathname);
}

这只是在它上方调用do_rmdir函数。这是:

static long do_rmdir(int dfd, const char __user *pathname)
{
    int error = 0;
    struct filename *name;
    struct dentry *dentry;
    struct nameidata nd;
    unsigned int lookup_flags = 0;
retry:
    name = user_path_parent(dfd, pathname, &nd, lookup_flags);
    if (IS_ERR(name))
        return PTR_ERR(name);

    switch(nd.last_type) {
    case LAST_DOTDOT:
        error = -ENOTEMPTY;
        goto exit1;
    case LAST_DOT:
        error = -EINVAL;
        goto exit1;
    case LAST_ROOT:
        error = -EBUSY;
        goto exit1;
    }

    nd.flags &= ~LOOKUP_PARENT;
    error = mnt_want_write(nd.path.mnt);
    if (error)
        goto exit1;

    mutex_lock_nested(&nd.path.dentry->d_inode->i_mutex, I_MUTEX_PARENT);
    dentry = lookup_hash(&nd);
    error = PTR_ERR(dentry);
    if (IS_ERR(dentry))
        goto exit2;
    if (!dentry->d_inode) {
        error = -ENOENT;
        goto exit3;
    }
    error = security_path_rmdir(&nd.path, dentry);
    if (error)
        goto exit3;
    error = vfs_rmdir(nd.path.dentry->d_inode, dentry);
exit3:
    dput(dentry);
exit2:
    mutex_unlock(&nd.path.dentry->d_inode->i_mutex);
    mnt_drop_write(nd.path.mnt);
exit1:
    path_put(&nd.path);
    putname(name);
    if (retry_estale(error, lookup_flags)) {
        lookup_flags |= LOOKUP_REVAL;
        goto retry;
    }
    return error;
}

我尝试添加一个printk语句,但结果超出了使用该内核的实际UML。结果根本没有显示在正确的UML窗口中 - (使用此内核的窗口)。我不确定如何在内核空间中进行I / O.有人可以帮忙吗?感谢。

2 个答案:

答案 0 :(得分:4)

您正试图在完全错误的地方进行此更改。要修改的rmdir命令不是内核的一部分,它是一个用户空间程序。在我的系统上,rmdir来自GNU coreutils。要了解您的内容是否相同,请在您的shell中尝试rmdir --help

如果您确认自己也在使用GNU coreutils,则可以从gnu.org下载源代码,修改它,重新编译并将修改后的二进制文件复制到/bin目录中。

然而,有一种更简单的方法可以做你想做的事情:写一个小的shell脚本来做出所需的确认请求,然后运行/bin/rmdir。如果需要,您可以调用脚本rmdir

答案 1 :(得分:1)

以下命令可满足您的要求。

rm -r --interactive=always <Directory>

实际上,您无法从内核空间获得任何操作的任何确认,这就是为什么用户空间程序/应用程序的设计更具交互性。