Python命名管道行为

时间:2015-11-22 13:56:12

标签: python linux named-pipes raspbian raspberry-pi2

我主要是一名PLC程序员,他的任务是编写一些代码在Raspberry Pi2B(Raspbian Wheezy)上运行,以便从RPi上运行的另一个进程中获取一些数据,并在Modbus TCP上提供这些数据( PLC协议)接口。我有它的工作,但我现在正试图防止它。我为IPC选择了命名管道,这就是我的问题。在我的Python(v2.7)示例代码中,如果我启动我的阅读器,它会打开并转到readline命令并按预期阻塞。当我启动我的编写器并选择打开,写入和关闭管道时,它会按预期执行并将记录写入管道。然而,读者只是坐在那里阻塞readline命令。当作者循环回来并询问是否打开管道时,如果我选择“y”,我的读者会吐出在前一循环中写入的记录。我很高兴我得到了我的数据,但不明白为什么“打开”编写器中的管道导致读者在那时抓取数据。在我的作家写完记录之后,我会认为我会看到读数据。另外,我认为“关闭”Writer代码中的管道没有做任何事情,因为我可以在第一次通过逻辑打开管道,写一条记录,然后在下一次通过逻辑我可以选择不打开管道并仍然成功写入。

  1. 我在这里失踪了什么? (修辞,有点)
  2. 在循环中写入命名管道的正确方法是什么?
  3. 为什么读者只在Writer“打开”管道后才抓取一条记录(无论它是否在上一次循环中打开)?
  4. 提前感谢并对我好...请记住,我只是一个被迫进入Python-World的旧PLC程序员!

    编剧:

    TreeMap<Integer, TreeSet>

    阅读器:

    #!/usr/bin/env python
    import logging
    logging.basicConfig(format='%(asctime)s %(message)s') 
    log = logging.getLogger()
    log.setLevel(logging.DEBUG)
    log.debug('Logging has started')
    
    log.debug('DocTest Pipe Writer')
    import os, time, sys
    PipeName = 'DocTestPipe'
    
    if not os.path.exists(PipeName):
        log.debug('Pipe not present...Creating...')
        os.mkfifo(PipeName, 0777)
        log.debug('Pipe is made')
    else:
        log.debug('Pipe already present')
    ModbusSeed = 0
    while True:
        OpenPipe = raw_input ('Open pipe? y or n')
        if OpenPipe == 'y':
            log.debug('Opening pipe')
            PipeOut = open(PipeName, 'w')
            log.debug('Pipe is open for writing.')
        else:
             log.debug('Chose not to open pipe')   
        DataPipeString = '%05d' % ModbusSeed+','+'%05d' % (ModbusSeed+1)+','+'%05d' % (ModbusSeed+2)+','+ \
            '%05d' % (ModbusSeed+3)+','+'%05d' % (ModbusSeed+4)+','+'%05d' % (ModbusSeed+5)+','+ \
            '%05d' % (ModbusSeed+6)+','+'%05d' % (ModbusSeed+7)+','+'%05d' % (ModbusSeed+8)+','+ \
            '%05d' % (ModbusSeed+9)+'\n'
        print 'Pipe Data to write: '+DataPipeString
        WritePipe=raw_input('Write Pipe? y or n')
        if WritePipe == 'y':
            log.debug('Writing pipe')
            PipeOut.write(DataPipeString)
            log.debug('Pipe is written.')
        ClosePipe = raw_input('Close pipe? y or n')
        if ClosePipe == 'y':
            log.debug('Closing pipe')
            PipeOut.close
            log.debug('Pipe is closed')
        else:
            log.debug('Pipe left open')
        ModbusSeed=ModbusSeed+1
    

1 个答案:

答案 0 :(得分:1)

经过多次搔痒,搜索互联网,以及反复试验,我得到了答案。问题的症结在于,当我打开管道写作时,我没有指定“缓冲”参数。这导致我的管道写入被缓存在缓冲区中的某处,而不是立即写入管道。每当我“打开”我的写管道时,它就会将缓冲区冲到管道上,然后我的读取器将其拾起。解决方案是在我的“open”命令中添加“,0”作为附加参数(PipeOut = open(PipeName,'w',0)而不是PipeOut = open(PipeName,'w')),从而设置缓冲区大小为零。现在,当我“写”到管道时,数据直接进入管道,并且在刷新之前不会处于不稳定状态。