Simple httpd web server running on 4.3 BSD VAX |
So I followed the instructions and got a working web server by compiling Nigel Griffiths's nweb which needed only minor tweaks to get compiled with gcc version 2.7.2.2 VAX-DEC-BSD. You can download the tweaked nweb from here.
It works fine, except that every time it serves a web page, it leaves a zombie <defunct> process behind in 4.3 BSD process table:
I played around with the nweb23.c source code trying things including changing the System-V SIGCLD to BSD SIGCHLD, a dedicated signal handler function, introducing wait() system call, etc. but could not get rid of zombies left behind when the forked process exited after serving a http request. It appears the confusion about zombies was pretty common in these ancient but exciting times - for example here is excerpt from Shichao's Notes:
SIGCLD
Semantics
Two signals that continually generate confusion are
SIGCLD
and SIGCHLD
. The name SIGCLD
(without the H
) is from System V, and this signal has different semantics from the BSD signal, named SIGCHLD
. The POSIX.1 signal is also named SIGCHLD
.
The semantics of the BSD
SIGCHLD
signal are normal and its semantics are similar to all other signals. When the signal occurs, the status of a child has changed, and we need to call one of the wait
functions to determine what has happened.
System V, however, has traditionally handled the
SIGCLD
signal differently from other signals:- If the process specifically sets its disposition to
SIG_IGN
, children of the calling process will not generate zombie processes. [p333]- 4.4BSD always generates zombies if
SIGCHLD
is ignored. If we want to avoid zombies, we have towait
for our children.
- 4.4BSD always generates zombies if
- If we set the disposition of
SIGCLD
to be caught, the kernel immediately checks whether any child processes are ready to bewait
ed for and, if so, calls theSIGCLD
handler. [p333-335]- FreeBSD 8.0 and Mac OS X 10.6.8 don’t exhibit this problem, because BSD-based systems generally don’t support historical System V semantics for SIGCLD.
- Linux 3.2.0 also doesn’t exhibit this problem, because it doesn’t call the
SIGCHLD
signal handler when a process arranges to catchSIGCHLD
and child processes are ready to be waited for, even thoughSIGCLD
andSIGCHLD
are defined to be the same value. - Solaris avoids this problem by including extra code in the kernel.
Of the four platforms described in this text, only Linux 3.2.0 and Solaris 10 define
SIGCLD
. On these platforms, SIGCLD
is equivalent to SIGCHLD
.
Perhaps the 4.3 BSD kernel works this way and does a cleanup of zombies when needed, as some other literature indicates.
In any case, I gave up on nweb for 4.3 BSD VAX, and switched to a much simpler, and far more rudimentary, httpd responder (I cannot call it a web server): David Egan's HTTP Server in C. This one is as minimal as it gets - when it receives anything on its listening port, it simply accepts the connection and sends back a hard-coded HTTP header string and all lines in a local file back out. It does not try to create child processes etc. I call it "shs" (simple http server) and here is the slightly-tweaked source that compiles fine with gcc 2.7.2.2 on 4.3 BSD VAX:
I also compiled the old "wget" version using gcc on 4.3 BSD VAX. This allows convenient downloading of stuff from around the web. The 4.3 BSD VAX binaries of nweb, shs and wget can be downloaded from my google drive.
Lastly, you can see the little 4.3 BSD VAX http web server in action at http://sanyal.duckdns.org:94/.