<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://performiq.com/kb/index.php?action=history&amp;feed=atom&amp;title=Fork.py</id>
	<title>Fork.py - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://performiq.com/kb/index.php?action=history&amp;feed=atom&amp;title=Fork.py"/>
	<link rel="alternate" type="text/html" href="https://performiq.com/kb/index.php?title=Fork.py&amp;action=history"/>
	<updated>2026-05-20T20:45:11Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>https://performiq.com/kb/index.php?title=Fork.py&amp;diff=3095&amp;oldid=prev</id>
		<title>PeterHarding at 06:07, 19 July 2009</title>
		<link rel="alternate" type="text/html" href="https://performiq.com/kb/index.php?title=Fork.py&amp;diff=3095&amp;oldid=prev"/>
		<updated>2009-07-19T06:07:18Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 16:07, 19 July 2009&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l374&quot;&gt;Line 374:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 374:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Python]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Python]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:Examples]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>PeterHarding</name></author>
	</entry>
	<entry>
		<id>https://performiq.com/kb/index.php?title=Fork.py&amp;diff=2964&amp;oldid=prev</id>
		<title>PeterHarding at 02:21, 30 March 2009</title>
		<link rel="alternate" type="text/html" href="https://performiq.com/kb/index.php?title=Fork.py&amp;diff=2964&amp;oldid=prev"/>
		<updated>2009-03-30T02:21:02Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 12:21, 30 March 2009&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l2&quot;&gt;Line 2:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 2:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#!/usr/bin/env python&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#!/usr/bin/env python&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#  &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Purpoe&lt;/del&gt;: Check &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;functionn &lt;/del&gt;of fork &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;under &lt;/del&gt;cygwin&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#  &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Purpose&lt;/ins&gt;: Check &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;function &lt;/ins&gt;of fork&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;() with &lt;/ins&gt;cygwin&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#  $Id: fork2.py,v 1.1.1.1 2003/10/22 13:05:22 zyx Exp $&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#  $Id: fork2.py,v 1.1.1.1 2003/10/22 13:05:22 zyx Exp $&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l11&quot;&gt;Line 11:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 11:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   More complex fork framework&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   More complex fork framework&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   fork and in the child use setsid() and other calls to detach&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   fork&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;() &lt;/ins&gt;and in the child use setsid() and other calls to detach&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   from the controllling terminal&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   from the controllling terminal&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>PeterHarding</name></author>
	</entry>
	<entry>
		<id>https://performiq.com/kb/index.php?title=Fork.py&amp;diff=1465&amp;oldid=prev</id>
		<title>PeterHarding at 02:59, 25 February 2008</title>
		<link rel="alternate" type="text/html" href="https://performiq.com/kb/index.php?title=Fork.py&amp;diff=1465&amp;oldid=prev"/>
		<updated>2008-02-25T02:59:52Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 12:59, 25 February 2008&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l372&quot;&gt;Line 372:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 372:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:Python]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>PeterHarding</name></author>
	</entry>
	<entry>
		<id>https://performiq.com/kb/index.php?title=Fork.py&amp;diff=1284&amp;oldid=prev</id>
		<title>PeterHarding: New page: &lt;pre&gt; #!/usr/bin/env python # #  Purpoe: Check functionn of fork under cygwin # #  $Id: fork2.py,v 1.1.1.1 2003/10/22 13:05:22 zyx Exp $ # #------------------------------------------------...</title>
		<link rel="alternate" type="text/html" href="https://performiq.com/kb/index.php?title=Fork.py&amp;diff=1284&amp;oldid=prev"/>
		<updated>2008-02-15T04:44:26Z</updated>

		<summary type="html">&lt;p&gt;New page: &amp;lt;pre&amp;gt; #!/usr/bin/env python # #  Purpoe: Check functionn of fork under cygwin # #  $Id: fork2.py,v 1.1.1.1 2003/10/22 13:05:22 zyx Exp $ # #------------------------------------------------...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
#&lt;br /&gt;
#  Purpoe: Check functionn of fork under cygwin&lt;br /&gt;
#&lt;br /&gt;
#  $Id: fork2.py,v 1.1.1.1 2003/10/22 13:05:22 zyx Exp $&lt;br /&gt;
#&lt;br /&gt;
#---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
  More complex fork framework&lt;br /&gt;
&lt;br /&gt;
  fork and in the child use setsid() and other calls to detach&lt;br /&gt;
  from the controllling terminal&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import getopt&lt;br /&gt;
import os&lt;br /&gt;
import sys&lt;br /&gt;
import signal&lt;br /&gt;
import time&lt;br /&gt;
import logging&lt;br /&gt;
import whrandom&lt;br /&gt;
&lt;br /&gt;
#---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
__id__        = &amp;quot;@(#) fork2.py  [1.0.0] 14/10/2003&amp;quot;&lt;br /&gt;
__version__   = &amp;quot;1.0.0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
TRUE          =  1&lt;br /&gt;
FALSE         =  0&lt;br /&gt;
&lt;br /&gt;
LOGFILE      = &amp;quot;fork2.log&amp;quot;&lt;br /&gt;
PIDFILE      = &amp;quot;fork2.pid&amp;quot;&lt;br /&gt;
&lt;br /&gt;
daemonFlg     =  0&lt;br /&gt;
debugFlg      =  0&lt;br /&gt;
silentFlg     =  0&lt;br /&gt;
verboseFlg    =  0&lt;br /&gt;
waitFlg       =  0&lt;br /&gt;
inParent      =  0&lt;br /&gt;
&lt;br /&gt;
pause         =  2&lt;br /&gt;
duration      = 10&lt;br /&gt;
noSessions    = 10&lt;br /&gt;
&lt;br /&gt;
#=====================================================================&lt;br /&gt;
&lt;br /&gt;
def now(): &lt;br /&gt;
   return time.ctime(time.time())       # current time on the server&lt;br /&gt;
&lt;br /&gt;
#---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
def shutdown():&lt;br /&gt;
   log.info(&amp;quot;[fork2]  Suttting down&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
   if inParent:&lt;br /&gt;
      os.unlink(PIDFILE)&lt;br /&gt;
&lt;br /&gt;
   sys.exit(99)&lt;br /&gt;
&lt;br /&gt;
#---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
def sigTerm(signum, frame):&lt;br /&gt;
   &amp;quot;SIGTERM handler&amp;quot;&lt;br /&gt;
&lt;br /&gt;
   s = &amp;quot;[fork2]  Caught SIGTERM!&amp;quot;&lt;br /&gt;
   print s&lt;br /&gt;
   log.info(s)&lt;br /&gt;
&lt;br /&gt;
   shutdown()&lt;br /&gt;
&lt;br /&gt;
#---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
def readConfig():&lt;br /&gt;
   pass&lt;br /&gt;
&lt;br /&gt;
#---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
def checkRunning():&lt;br /&gt;
   try:&lt;br /&gt;
      pfp = open(PIDFILE, &amp;#039;r&amp;#039;)&lt;br /&gt;
   except IOError, e:&lt;br /&gt;
      pfp = 0&lt;br /&gt;
&lt;br /&gt;
   if pfp:&lt;br /&gt;
      line = pfp.readline()&lt;br /&gt;
      line = line.strip()&lt;br /&gt;
&lt;br /&gt;
      serverPid   = int(line)&lt;br /&gt;
&lt;br /&gt;
      noProcess    = 0&lt;br /&gt;
&lt;br /&gt;
      try:&lt;br /&gt;
         os.kill(serverPid, 0)&lt;br /&gt;
      except OSError, e:&lt;br /&gt;
         if e.errno == 3:&lt;br /&gt;
            noProcess = 1&lt;br /&gt;
         else:&lt;br /&gt;
            print &amp;quot;kill() failed with errno %d&amp;quot; % e.errno&lt;br /&gt;
            sys.exit(0)&lt;br /&gt;
&lt;br /&gt;
      if noProcess:&lt;br /&gt;
         print &amp;quot;[fork2]  Stale server pid file!&amp;quot;&lt;br /&gt;
         pfp.close()&lt;br /&gt;
         os.unlink(PIDFILE)&lt;br /&gt;
&lt;br /&gt;
         return 0&lt;br /&gt;
      else:&lt;br /&gt;
         pfp.close()&lt;br /&gt;
         return serverPid&lt;br /&gt;
&lt;br /&gt;
      return serverPid&lt;br /&gt;
   else:&lt;br /&gt;
      return 0&lt;br /&gt;
&lt;br /&gt;
#---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
def writePidfile(pid):&lt;br /&gt;
   try:&lt;br /&gt;
      pfp = open(PIDFILE, &amp;#039;w&amp;#039;)&lt;br /&gt;
   except IOError, e:&lt;br /&gt;
      print &amp;quot;[fork2]  Could not open %s&amp;quot; % PIDFILE&lt;br /&gt;
      sys.exit(0)&lt;br /&gt;
&lt;br /&gt;
   print &amp;gt;&amp;gt;pfp, &amp;quot;%d&amp;quot; % pid&lt;br /&gt;
&lt;br /&gt;
   pfp.close()&lt;br /&gt;
&lt;br /&gt;
   return pid&lt;br /&gt;
&lt;br /&gt;
#---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
def becomeDaemon():&lt;br /&gt;
   pid = os.fork()&lt;br /&gt;
&lt;br /&gt;
   if pid == 0:     # In child&lt;br /&gt;
      print &amp;quot;[fork2]  fork() -&amp;gt; 0 (%d)&amp;quot; % getpid()&lt;br /&gt;
      time.sleep(1)&lt;br /&gt;
      pass&lt;br /&gt;
   elif pid == -1:  # Error&lt;br /&gt;
      print &amp;quot;[fork2]  fork() failed!&amp;quot;&lt;br /&gt;
      time.sleep(1)&lt;br /&gt;
      sys.exit(0)&lt;br /&gt;
   else:            # In parent&lt;br /&gt;
      print &amp;quot;[fork2]  fork() -&amp;gt;&amp;quot;, getpid()&lt;br /&gt;
      time.sleep(1)&lt;br /&gt;
      sys.exit(0)&lt;br /&gt;
&lt;br /&gt;
   time.sleep(2)&lt;br /&gt;
&lt;br /&gt;
   os.setsid()&lt;br /&gt;
&lt;br /&gt;
   pid = os.getpid()&lt;br /&gt;
&lt;br /&gt;
   return pid&lt;br /&gt;
&lt;br /&gt;
#---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
def init():&lt;br /&gt;
   global ctrlPid&lt;br /&gt;
&lt;br /&gt;
   ctrlPid = checkRunning()&lt;br /&gt;
&lt;br /&gt;
   if ctrlPid:&lt;br /&gt;
      print &amp;quot;[fork2]  Server already running! (pid = %d)&amp;quot; % ctrlPid&lt;br /&gt;
      sys.exit(0)&lt;br /&gt;
&lt;br /&gt;
   if daemonFlg:&lt;br /&gt;
      ctrlPid = becomeDaemon()&lt;br /&gt;
   else:&lt;br /&gt;
      ctrlPid = os.getpid()&lt;br /&gt;
&lt;br /&gt;
   writePidfile(ctrlPid)&lt;br /&gt;
&lt;br /&gt;
   global log&lt;br /&gt;
&lt;br /&gt;
   log  = logging.getLogger(&amp;#039;fork2&amp;#039;)&lt;br /&gt;
   hdlr = logging.FileHandler(LOGFILE)&lt;br /&gt;
   fmtr = logging.Formatter(&amp;#039;%(asctime)s %(levelname)s %(message)s&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
   hdlr.setFormatter(fmtr)&lt;br /&gt;
   log.addHandler(hdlr) &lt;br /&gt;
   log.setLevel(logging.INFO)&lt;br /&gt;
&lt;br /&gt;
   log.info(&amp;quot;Server started processing&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
   global uname&lt;br /&gt;
&lt;br /&gt;
   readConfig()&lt;br /&gt;
&lt;br /&gt;
   if (not silentFlg):&lt;br /&gt;
      print &amp;quot;[fork2]  Server pid is %d&amp;quot; % ctrlPid&lt;br /&gt;
&lt;br /&gt;
   signal.signal(signal.SIGTERM, sigTerm)&lt;br /&gt;
&lt;br /&gt;
#---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
def terminate():&lt;br /&gt;
   serverPid = checkRunning()&lt;br /&gt;
&lt;br /&gt;
   if serverPid:&lt;br /&gt;
      if (not silentFlg):&lt;br /&gt;
         print &amp;quot;[fork2]  Terminating server with pid, %d\n&amp;quot; % serverPid&lt;br /&gt;
&lt;br /&gt;
      os.kill(serverPid, signal.SIGTERM)&lt;br /&gt;
&lt;br /&gt;
      if (waitFlg):&lt;br /&gt;
         while 1:&lt;br /&gt;
            try:&lt;br /&gt;
               kill(serverPid, 0)&lt;br /&gt;
            except OSError, e:&lt;br /&gt;
               if e.errno == 3:&lt;br /&gt;
                  break&lt;br /&gt;
               else:&lt;br /&gt;
                  print &amp;quot;[server:terminate]  kill() failed with errno %d&amp;quot; % e.errno&lt;br /&gt;
                  sys.exit(0)&lt;br /&gt;
 &lt;br /&gt;
            time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
   return 0&lt;br /&gt;
&lt;br /&gt;
#=====================================================================&lt;br /&gt;
&lt;br /&gt;
def doChild(no):&lt;br /&gt;
   global inParent&lt;br /&gt;
&lt;br /&gt;
   inParent = 0&lt;br /&gt;
&lt;br /&gt;
   toGo = float(duration + 10)&lt;br /&gt;
&lt;br /&gt;
   #os.setsid()&lt;br /&gt;
&lt;br /&gt;
   pid = os.getpid()&lt;br /&gt;
&lt;br /&gt;
   signal.signal(signal.SIGTERM, sigTerm)&lt;br /&gt;
&lt;br /&gt;
   while toGo &amp;gt; 0.0:&lt;br /&gt;
      t     = whrandom.randint(1, 1000) * 0.001&lt;br /&gt;
&lt;br /&gt;
      toGo -= t&lt;br /&gt;
      time.sleep(t)&lt;br /&gt;
      s = &amp;quot;[fork2]  In child %3d [%d] - %5.2f&amp;quot; % (no, pid, t)&lt;br /&gt;
      log.info(s)&lt;br /&gt;
      print s&lt;br /&gt;
&lt;br /&gt;
#---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
def spawn():&lt;br /&gt;
   global inParent&lt;br /&gt;
&lt;br /&gt;
   inParent = 1&lt;br /&gt;
&lt;br /&gt;
   pids = {}&lt;br /&gt;
&lt;br /&gt;
   for i in range(noSessions):&lt;br /&gt;
      pid = os.fork()&lt;br /&gt;
&lt;br /&gt;
      if pid == 0:     # In child&lt;br /&gt;
         doChild(i)&lt;br /&gt;
      elif pid == -1:  # Error&lt;br /&gt;
         print &amp;quot;[fork2]  fork() failed!&amp;quot;&lt;br /&gt;
         time.sleep(2)&lt;br /&gt;
&lt;br /&gt;
         sys.exit(0)&lt;br /&gt;
      else:            # In parent&lt;br /&gt;
         pids[i]   = pid&lt;br /&gt;
&lt;br /&gt;
   myPid = os.getpid()&lt;br /&gt;
&lt;br /&gt;
   print &amp;quot;[fork2]  In parent [%d]: fork() -&amp;gt; %d&amp;quot; % (myPid, pid)&lt;br /&gt;
   print &amp;quot;[fork2]  In parent [%d]: waiting...&amp;quot; % myPid&lt;br /&gt;
&lt;br /&gt;
   time.sleep(duration)&lt;br /&gt;
&lt;br /&gt;
   print &amp;quot;[fork2]  *** In parent [%d]: Applying SIGTERM&amp;quot; % myPid&lt;br /&gt;
&lt;br /&gt;
   for i in range(noSessions):&lt;br /&gt;
      os.kill(pids[i], signal.SIGTERM)&lt;br /&gt;
&lt;br /&gt;
   while 1:&lt;br /&gt;
      try:&lt;br /&gt;
         (pid, status) = os.wait()&lt;br /&gt;
      except OSError, e:&lt;br /&gt;
         if e.errno == 10:  # No children&lt;br /&gt;
            break&lt;br /&gt;
&lt;br /&gt;
      print &amp;quot;[fork2]  In parent - wait() --&amp;gt; (PID %d, Status %d, Signal %d)&amp;quot; % \&lt;br /&gt;
           (pid, ((status &amp;amp; 0xff00)&amp;gt;&amp;gt;8), (status &amp;amp; 0xff))&lt;br /&gt;
&lt;br /&gt;
      i -= 1&lt;br /&gt;
&lt;br /&gt;
   return 0&lt;br /&gt;
&lt;br /&gt;
#---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
   global debugFlg&lt;br /&gt;
   global verboseFlg&lt;br /&gt;
   global waitFlg&lt;br /&gt;
   global duration&lt;br /&gt;
   global noSessions&lt;br /&gt;
&lt;br /&gt;
   try:&lt;br /&gt;
      opts, args = getopt.getopt(sys.argv[1:], &amp;quot;dD:n:TvVw?&amp;quot;)&lt;br /&gt;
   except getopt.error, e:&lt;br /&gt;
      print __doc__&lt;br /&gt;
      return 1&lt;br /&gt;
&lt;br /&gt;
   wrk  = os.getcwd()&lt;br /&gt;
   base = os.path.basename(wrk)&lt;br /&gt;
&lt;br /&gt;
   for o, a in opts:&lt;br /&gt;
      if o == &amp;#039;-d&amp;#039;:&lt;br /&gt;
         debugFlg      = 1&lt;br /&gt;
      elif o == &amp;#039;-D&amp;#039;:&lt;br /&gt;
         duration      = int(a)&lt;br /&gt;
      elif o == &amp;#039;-n&amp;#039;:&lt;br /&gt;
         noSessons     = int(a)&lt;br /&gt;
      elif o == &amp;#039;-T&amp;#039;:&lt;br /&gt;
         terminate()&lt;br /&gt;
         return 0&lt;br /&gt;
      elif o == &amp;#039;-v&amp;#039;:&lt;br /&gt;
         verboseFlg    = 1&lt;br /&gt;
      elif o == &amp;#039;-V&amp;#039;:&lt;br /&gt;
         print &amp;quot;[fork2]  Version: %s&amp;quot; % __version__&lt;br /&gt;
         return 1&lt;br /&gt;
      elif o == &amp;#039;-w&amp;#039;:&lt;br /&gt;
         waitFlg       = 1&lt;br /&gt;
      elif o == &amp;#039;-?&amp;#039;:&lt;br /&gt;
         print __doc__&lt;br /&gt;
         return 1&lt;br /&gt;
&lt;br /&gt;
   print &amp;quot;[fork2]  Working directory is %s&amp;quot; % os.getcwd()&lt;br /&gt;
&lt;br /&gt;
   if args:&lt;br /&gt;
      for arg in args:&lt;br /&gt;
         print arg&lt;br /&gt;
&lt;br /&gt;
   init()&lt;br /&gt;
&lt;br /&gt;
   spawn()&lt;br /&gt;
&lt;br /&gt;
#---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;#039;__main__&amp;#039; or __name__ == sys.argv[0]:&lt;br /&gt;
   try:&lt;br /&gt;
      sys.exit(main())&lt;br /&gt;
   except KeyboardInterrupt, e:&lt;br /&gt;
      s = &amp;quot;[fork2]  Interrupted!&amp;quot;&lt;br /&gt;
      print s&lt;br /&gt;
      log.info(s)&lt;br /&gt;
      shutdown()&lt;br /&gt;
&lt;br /&gt;
#---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
Revision History:&lt;br /&gt;
&lt;br /&gt;
     Date     Who   Description&lt;br /&gt;
   --------   ---   --------------------------------------------------&lt;br /&gt;
   20031018   plh   Initial implementation&lt;br /&gt;
&lt;br /&gt;
Problems to fix:&lt;br /&gt;
&lt;br /&gt;
To Do:&lt;br /&gt;
&lt;br /&gt;
Issues:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>PeterHarding</name></author>
	</entry>
</feed>