summaryrefslogtreecommitdiffstats
path: root/scripts/fork.py
diff options
context:
space:
mode:
authorChristopher Davis <loafier@gmail.com>2006-08-15 05:04:04 +0000
committerChristopher Davis <loafier@gmail.com>2006-08-15 05:04:04 +0000
commit9283d8982431b9e1371efdd5cd731fe4e7db7fe8 (patch)
tree68e30c306ae491acc85368bae14ffb837a717583 /scripts/fork.py
parent501cfa59a78c2cb7ea76e9686aa33221c77ac9f3 (diff)
downloadirssi-python-9283d8982431b9e1371efdd5cd731fe4e7db7fe8.tar.gz
irssi-python-9283d8982431b9e1371efdd5cd731fe4e7db7fe8.tar.xz
irssi-python-9283d8982431b9e1371efdd5cd731fe4e7db7fe8.zip
fixing up for test1
git-svn-id: http://svn.irssi.org/repos/irssi-python@4315 dbcabf3a-b0e7-0310-adc4-f8d773084564
Diffstat (limited to 'scripts/fork.py')
-rw-r--r--scripts/fork.py63
1 files changed, 63 insertions, 0 deletions
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)