import os, signal

class subproc:
	def __init__(self, path, args):
		self.path = path
		self.args = args
		self.subout, new_out = os.pipe()
		new_in, self.subin = os.pipe()
		pid = os.fork()
		if pid:
			os.close(new_in); os.close(new_out)
			self.pid = pid
		else:
			os.dup2(new_in, 0); os.dup2(new_out, 1)
			os.close(new_in); os.close(new_out)
			os.execvp(path, args)
	def restart(self):
		self.close()
		self.__init__(self.path, self.args)
	def fileno(self):
		return self.readfd()
	def child_status(self):
		return os.waitpid(self.pid, os.WNOHANG)
	def child_pid(self):
		return self.pid
	def read(self, n):
		return os.read(self.subout, n)
	def write(self, text):
		return os.write(self.subin, text)
	def readfd(self):
		return self.subout
	def writefd(self):
		return self.subin
	def kill(self, sig):
		return os.kill(self.pid, sig)
	def close(self):
		try:
			os.kill(self.pid, signal.SIGTERM)
			os.close(self.subin); os.close(self.subout)
			return os.waitpid(self.pid, os.WNOHANG)
		except:
			return None

class wsubproc(subproc):
	def fileno(self):
		return self.writefd()

if __name__ == "__main__":
	import sys
	test = subproc("ls", ["ls","-l"])
	data = test.read(1024)
	while data:
		sys.stdout.write(data)
		data = test.read(1024)
