Errno : 13 在 proc 条目上使用 fopen

发布于 2025-01-05 07:45:40 字数 859 浏览 0 评论 0原文

我正在尝试编写由可加载内核模块创建的 /proc 文件。我正在使用 fopen() 打开文件进行写入,但收到 errno : 13 (权限被拒绝)。

FILE *fp;
fp = fopen("/proc/file1","w");
if(fp == NULL){
     printf("Errno : %d",errno); // prints 13
}

The LKM contains the following code:

static struct proc_dir_entry *proc_entry;

static ssize_t proc_write(struct file *filp, const char __user *buff, unsigned long len, void *data)
{  
    // code writes from buffer to local variable

    return len;
}

static ssize_t proc_read(char *page, char **start, off_t off, int count, int *eof, void *data)
{
    // code for reading file

    return 0;
}


int proc_open(struct inode *inode, struct file *file)
{
    try_module_get(THIS_MODULE);
    return 0;
}

int proc_close(struct inode *inode, struct file *file)
{
    module_put(THIS_MODULE);
    return 0;
}

关于如何克服这个问题有什么建议吗?

谢谢。

I am trying to write a /proc file created by a loadable kernel module. I am using fopen() to open the file for write but am getting errno : 13 (permission denied).

FILE *fp;
fp = fopen("/proc/file1","w");
if(fp == NULL){
     printf("Errno : %d",errno); // prints 13
}

The LKM contains the following code:

static struct proc_dir_entry *proc_entry;

static ssize_t proc_write(struct file *filp, const char __user *buff, unsigned long len, void *data)
{  
    // code writes from buffer to local variable

    return len;
}

static ssize_t proc_read(char *page, char **start, off_t off, int count, int *eof, void *data)
{
    // code for reading file

    return 0;
}


int proc_open(struct inode *inode, struct file *file)
{
    try_module_get(THIS_MODULE);
    return 0;
}

int proc_close(struct inode *inode, struct file *file)
{
    module_put(THIS_MODULE);
    return 0;
}

Any suggestions on how to overcome this?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

亣腦蒛氧 2025-01-12 07:45:40

最可能的答案是创建的 procfs 节点没有正确的用户权限。

当以 root 身份运行时,它会绕过节点的大部分权限检查,因此您不会收到错误(也有例外;这是一般情况)。

在内核可加载模块中,它创建了 procfs 节点(在 .c 文件中的某个位置):

create_proc_entry(...)

您需要确保第二个参数(模式)设置为允许 root 以外的用户打开以进行写入,以便支持您想要的开放选项;例如 0666 使该文件可由任何人以读/写方式全局打开。

通常,procfs 中的节点是使用标志 0444 创建的(即仅适用于所有用户的 R/O)。有些是在 0644 模式下创建的(root 读/写,所有其他用户 R/O),有些是使用权限 0400 创建的(root 读/写,所有其他用户其他人远离)。

The most probable answer is that the procfs node that is created does not have the correct permissions for the user.

When run as root, it bypasses most of the permission checking for the node, so you do not receive an error (there are exceptions; this is the general case).

in the kernel loadable module, where it creates the procfs node (somewhere in the .c file):

create_proc_entry(...)

You need to make sure that the second parameter, the mode is set to something that permits opening for writing by users other than root in order to support your desired open option; e.g. 0666 makes the file globally openable as R/W by anyone.

Generally, nodes in procfs are created with the flags 0444 (i.e. R/O only for all users). Some are created in mode 0644 (R/W by root, R/O for all other users), some are created with permissions 0400 (R/O for root, all others stay away).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文