Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用用户空间中的常规文件模拟Linux设备模型_Python_Linux_Ipc - Fatal编程技术网

Python 使用用户空间中的常规文件模拟Linux设备模型

Python 使用用户空间中的常规文件模拟Linux设备模型,python,linux,ipc,Python,Linux,Ipc,我想通过带有文件的目录结构来表示守护进程的状态。守护进程负责向控制传感器提供shell接口。类似于Linux设备模型或GPIO控制台接口的实现方式,只是使用普通文件,在用户空间中用Python编写:) 例如: 守护进程运行并创建列出可用传感器的目录结构。目录结构的外观示例: sensors `-- sensor1 `-- sensor-ouput 传感器输出只是一个普通文件,用作当前传感器值的抽象 以下是创建示例结构的代码: import time,os if not os.

我想通过带有文件的目录结构来表示守护进程的状态。守护进程负责向控制传感器提供shell接口。类似于Linux设备模型或GPIO控制台接口的实现方式,只是使用普通文件,在用户空间中用Python编写:)

例如:

守护进程运行并创建列出可用传感器的目录结构。目录结构的外观示例:

sensors
`-- sensor1
    `-- sensor-ouput
传感器输出
只是一个普通文件,用作当前传感器值的抽象

以下是创建示例结构的代码:

import time,os

    if not os.path.exists('sensors/sensor1'):
        os.makedirs('sensors/sensor1')
    f = open('sensors/sensor1/sensor-ouput','w+')
    for i in range(100):
        time.sleep(1)
        f.seek(0)
        f.write(str(i))
        f.flush()
    f.close()
问题:

  • 为什么我可以在守护进程运行时写入文件<代码>回波1>传感器输出未给出错误
  • 只有一个进程写入文件,并且可能同时进行多次读取。在这些场景中是否存在我遗漏的一些同步问题
  • 鉴于文件是在ramfs分区上打开的,这种方法是否落后于使用命名管道

您可以写入文件,因为默认情况下文件未锁定。您需要使用os.lockf()锁定它

您的多个读卡器可能会在您期望相同的位置读取不同的值。考虑下面的场景

writer writes 10 reader #1 reads 10 reader #2 reads 10 writer writes 11 reader #3 reads 11 作者写了10篇文章 读取器#1读10 读取器#2读10 作者写了11篇文章 读取器#3读11 此时,读卡器3与读卡器1和读卡器2处于不同的状态

命名管道是FIFO结构,它们确保了文件未指定的消息顺序。另一方面,管道不是持久的,一旦消息被读取,它就会消失


编辑:实际上,fcntl.flock()可能是锁定所需的,而不是os.lockf()

,因为您不能做内核所能做的事情。绝对地内核从未实际写入文件。命名管道是一个完全不同的问题的解决方案。
内核从不实际写入文件
如果我将它们写入ram,它们也不会在这个解决方案中。如果你将文件写入ram磁盘,你仍然在写入文件。我认为更好的方法是像内核那样,即创建一个虚拟文件系统;用保险丝很容易做到。当其他应用程序试图读取(或执行其他操作)您公开的“假文件”时,fuse将调用您的函数,而不是不断地将(可能无用的)内容写入文件(也会将自己暴露于竞争条件等)。