diff options
author | Christopher Davis <loafier@gmail.com> | 2006-08-15 05:04:04 +0000 |
---|---|---|
committer | Christopher Davis <loafier@gmail.com> | 2006-08-15 05:04:04 +0000 |
commit | 9283d8982431b9e1371efdd5cd731fe4e7db7fe8 (patch) | |
tree | 68e30c306ae491acc85368bae14ffb837a717583 /scripts/fork.py | |
parent | 501cfa59a78c2cb7ea76e9686aa33221c77ac9f3 (diff) | |
download | irssi-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.py | 63 |
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) |