docs: def _read(self, cnt):
          """Read from pipe."""
  
          # normal read is usually enough
          data = self._fd.read(cnt)
          if len(data) == cnt or not data:
              return data
  
          # short read, try looping
          buf = [data]
          cnt -= len(data)
          while cnt > 0:
              data = self._fd.read(cnt)
              if not data:
                  break
              cnt -= len(data)
              buf.append(data)
          return EMPTY.join(buf)