使用用户空间

时间:2016-01-13 21:15:37

标签: python linux ipc

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

示例:

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

sensors
`-- sensor1
    `-- sensor-ouput

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()

问题:

  • 为什么我可以在守护程序运行时写入文件? echo 1 > sensor-ouput没有出错。
  • 只有一个进程写入文件,并且可能同时多次读取它。在这些场景中是否存在我缺少的某些同步问题?
  • 鉴于该文件是在ramfs分区上打开的,这种方法是否落后于使用命名管道?

1 个答案:

答案 0 :(得分:2)

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

您的多个读者可能会在您期望相同的位置读取不同的值。请考虑以下情况

writer writes 10
reader #1 reads 10
reader #2 reads 10
writer writes 11
reader #3 reads 11

此时读者#3处于与读者#1和#2相比处于不同的状态。

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

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