簡體   English   中英

linux內核I / O

[英]linux kernel I/O

我正在嘗試在linux內核上修改rm_dir命令。 我想添加一個確認請求。 諸如:“確定要刪除此目錄(是/否):”

我已經在文件系統的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。 有人可以幫忙嗎? 謝謝。

您試圖在完全錯誤的位置進行此更改。 您要修改的rmdir命令不是內核的一部分,它是一個用戶空間程序。 在我的系統上, rmdir來自GNU coreutils 要確定您的名稱是否相同,請在外殼程序中嘗試rmdir --help

如果確認還使用了GNU coreutils,則可以從gnu.org下載源代碼,對其進行修改,重新編譯,然后將修改后的二進制文件復制到/bin目錄中。

但是 ,有一種更簡單的方法可以完成您想做的事情:編寫一個小的shell腳本,發出所需的確認請求,然后運行/bin/rmdir 您可以根據需要調用腳本rmdir

下面的命令將滿足您的要求。

rm -r --interactive=always <Directory>

實際上,您無法從內核空間獲得任何操作的任何確認,這就是為什么用戶空間程序/應用程序設計得更具交互性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM