From 9283d8982431b9e1371efdd5cd731fe4e7db7fe8 Mon Sep 17 00:00:00 2001 From: Christopher Davis Date: Tue, 15 Aug 2006 05:04:04 +0000 Subject: fixing up for test1 git-svn-id: http://svn.irssi.org/repos/irssi-python@4315 dbcabf3a-b0e7-0310-adc4-f8d773084564 --- scripts/fork.py | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 scripts/fork.py (limited to 'scripts/fork.py') diff --git a/scripts/fork.py b/scripts/fork.py new file mode 100644 index 0000000..8d1e855 --- /dev/null +++ b/scripts/fork.py @@ -0,0 +1,63 @@ +import irssi +import os +import time +import sys + +child_pid = 0 + +def sig_pidwait(pid, status): + if child_pid != pid: + print 'pidwait dont know',pid + return + + if os.WIFSIGNALED(status): + print '%d killed by signal' % pid + elif os.WIFEXITED(status): + print '%d exited(%d)' % (pid, os.WEXITSTATUS(status)) + + irssi.signal_remove('pidwait') + +def read_child(fd, condition, out): + data = os.read(fd, 512) + if not data: + return False + out.write(data) + return True + +def childfunc(): + """ do your stuff """ + for i in xrange(30): + print 'ME CHILD', i + time.sleep(1) + + +def cmd_forkoff(data, server, witem): + global child_pid + + rs, ws = os.pipe() + re, we = os.pipe() + + pid = os.fork() + if pid > 0: + #parent + child_pid = pid + irssi.pidwait_add(pid) + print 'forked off',pid + irssi.signal_add('pidwait', sig_pidwait) + + #redirect child output + irssi.io_add_watch(rs, read_child, sys.stdout) + irssi.io_add_watch(re, read_child, sys.stderr) + + else: + #child + sys.stdout = os.fdopen(ws, 'w', 0) + sys.stderr = os.fdopen(we, 'w', 0) + + childfunc() + + sys.stdout.close() + sys.stderr.close() + os._exit(5) + +irssi.command_bind('forkoff', cmd_forkoff) -- cgit