getmail的文件描述符处理(dup2'ing stdout / stderr)是如何工作的?

时间:2017-10-22 11:44:24

标签: python

注意:我问的是关于Python和getmail的问题,而不是关于如何让getmail与Dovecot合作。它们是两个不同的问题,我想要理解我将依赖的库的源代码,就像我面临的直接问题一样。感谢。

我一直试图让getmail与Dovecot合作。它不会发生在我身上,所以我想我会看到getmail通过巧妙地(或者我认为)插入一个“tee”文件发送给Dovecot的内容,该文件将打印出来自getmail的传入数据。无论我看到什么流,我都无法使用它,所以我查看了getmail源代码,看看它是如何sending the data

def _deliver_command(self, msg, msginfo, delivered_to, received,
               stdout, stderr):
  try:
    # Write out message with native EOL convention
    msgfile = tempfile.TemporaryFile()
    msgfile.write(msg.flatten(delivered_to, received,
                              include_from=self.conf['unixfrom']))
    msgfile.flush()
    os.fsync(msgfile.fileno())
    # Rewind
    msgfile.seek(0)
    # Set stdin to read from this file
    os.dup2(msgfile.fileno(), 0)
    # Set stdout and stderr to write to files
    os.dup2(stdout.fileno(), 1)
    os.dup2(stderr.fileno(), 2)

注意,我对Python并不是特别熟悉。

那些os.dup2正在复制文件描述符,但是他们正在使用的fileno似乎是他们拥有的句柄的fileno。例如:

os.dup2(stdout.fileno(), 1)

stdout的fileno为1,那么对os.dup2的调用是什么呢?我可以理解这些流是否已经被重定向并且现在被重定向回来但是注释 #Set stdout和stderr写入文件似乎正好相反。

我正处于其中一个没有多少工作的日子,所以任何帮助都会受到高度赞赏,可能比正常情况多一点!

0 个答案:

没有答案