0

我目前正在编写一个简单的“多播”模块。

只有一个进程可以打开 proc 文件系统文件进行写入,其余进程可以打开它进行读取。为此,我使用 inode_operation .permission 回调,检查操作,当我检测到有人打开文件进行写入时,我将标志设置为 ON。

我需要一种方法来检测打开文件进行写入的进程是否决定关闭文件,以便我可以将标志设置为 OFF,以便其他人可以打开进行写入。

目前,如果有人愿意写作,我会保存该进程的current->pid,当调用 .close 回调时,我会检查该进程是否是我之前保存的进程。

有没有更好的方法来做到这一点?在不保存 pid 的情况下,可能会检查当前进程已打开的文件及其权限...

谢谢!

4

2 回答 2

2

不,这不安全。考虑几个场景:

  • 进程 A 打开文件进行写入,然后fork()s,创建进程 B。现在 A 和 B 都打开文件进行写入。当进程 A 关闭它时,您将标志设置为 0,但进程 B 仍将其打开以供写入。

  • 进程 A 有多个线程。线程 X 打开文件进行写入,但线程 Y 将其关闭。现在标志停留在 1。(请记住,->pid在内核空间中实际上是用户空间线程ID)。

与其在 inode 级别做事,不如在结构体的.open.release方法中做事。file_operations

你的 inode 的私有数据应该包含一个struct file *current_writer;, 初始化为NULL. 在该file_operations.open方法中,如果它正在被打开以进行写入,则检查current_writer; 如果为 NULL,则将其设置为struct file *正在打开,否则以EPERM. 在该file_operations.release方法中,检查struct file *正在释放的是否等于 inode 的current_writer- 如果是,则设置current_writerNULL.

PS:Bandan 也是正确的,你需要锁定,但是使用 inode 的现有i_mutex应该足以保护current_writer.

于 2010-05-12T05:01:59.210 回答
0

我希望我正确理解了您的问题:当有人想写入您的 proc 文件时,您将一个名为 flag 的变量设置为 1,并将 current->pid 保存在一个全局变量中。然后,当调用任何 close() 入口点时,检查 close() 实例的 current->pid 并将其与保存的值进行比较。如果匹配,您将标志关闭。对 ?

考虑这种情况:进程 A 想要写入您的 proc 资源,因此您检查权限回调。您看到标志为 0,因此您可以为进程 A 将其设置为 1。但此时,调度程序发现进程 A 已用完其时间份额并选择另一个进程运行(标志仍为 o!)。一段时间后,进程 B 也想写入您的 proc 资源,检查标志是否为 0,将其设置为 1,然后开始写入文件。不幸的是,此时进程 A 被安排再次运行,因为它认为标志为 0(请记住,在调度程序抢占它之前,标志为 0),因此将其设置为 1 并开始写入文件。最终结果:proc 资源中的数据损坏。

对于此类操作,您应该使用内核提供的良好锁定机制,并且根据您的要求,我认为 RCU 是最好的:看看RCU 锁定机制

于 2010-05-11T19:56:43.203 回答