From b14aceaa4f3806dd797cd3e31c1973387409784a Mon Sep 17 00:00:00 2001 From: mathieui Date: Tue, 22 Apr 2014 19:57:25 +0200 Subject: Close the file descriptor of the fifo on closing (also, it indeed needs to be a thread because opening a fifo for reading is a blocking operation) --- src/fifo.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/fifo.py b/src/fifo.py index 983b21e4..863ef228 100644 --- a/src/fifo.py +++ b/src/fifo.py @@ -1,12 +1,8 @@ -# Copyright 2011 Florent Le Coz -# -# This file is part of Poezio. -# -# Poezio is free software: you can redistribute it and/or modify -# it under the terms of the zlib license. See the COPYING file. - """ Defines the Fifo class + +This fifo allows simple communication between a remote poezio +and a local computer, with ssh+cat. """ import logging @@ -20,12 +16,11 @@ class OpenTrick(threading.Thread): A threaded trick to make the open for writing succeed. A fifo cannot be opened for writing if it has not been yet opened by the other hand for reading. - So, we just open the fifo for reading and close it - immediately afterwards. - Once that is done, we can freely keep the fifo open for - writing and write things in it. The writing can fail if - there’s still nothing reading that fifo, but we just yell - an error in that case. + So, we just open the fifo for reading and we do not close + it afterwards, because if the other reader disconnects, + we will receive a SIGPIPE. And we do not want that. + + (we never read anything from it, obviously) """ def __init__(self, path): threading.Thread.__init__(self) @@ -62,10 +57,15 @@ class Fifo(object): self.fd.flush() def readline(self): + "Read a line from the fifo" return self.fd.readline() def __del__(self): + "Close opened fds" try: self.fd.close() + if self.trick: + self.trick.fd.close() except: - pass + log.error('Unable to close descriptors for the fifo', + exc_info=True) -- cgit v1.2.3