473,241 Members | 1,598 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,241 software developers and data experts.

Daemon Server, Forking, Defunct Processes

I am writing a server daemon that forks a child for every incoming
request. The child process terminates when the client closes the
connection. My problem is that I am unsure how to prevent the child
process from becoming defunct. Here is an over-simplified main
function...

int main(void) {

// Daemonize
int pid;
if ((pid = fork()) != 0) {
exit(0);
}
setsid();
if ((pid = fork()) != 0) {
exit(0);
}

// Assume this gets the socket descriptor, binds
// the socket and listens on given port.
int server_socket = create_server_socket(1234);

int client_socket;

while (1) {
// Assume this accepts a request to the server socket
client_socket = accept_socket_request(server_socket);

if (!fork()) {
// Child

// Assume this initiates a text interaction
// with the client, looping until the client
// enters 'exit'. Then it returns.
session();

// Close the client connection
shutdown(client_socket, 2);

// The child exits
exit(0);

} else {

// Parent
waitpid(-1, NULL, WNOHANG);
}
}

// Close the server socket
shutdown(server_socket, 2);
return 0;
}

What is happening is that if a client terminates a child process the
parent isn't aware until a new connection/process is made. I think
this is because of my placement of waitpid(). The result is that
there is a defunct child sitting around until a new connection is
made, then the defunct process is cleaned up. There is always at
least 1 defunct process lying around. How can I remedy this?

Thanks,
Scott
Sep 11 '08 #1
3 5166
>I am writing a server daemon that forks a child for every incoming
>request. The child process terminates when the client closes the
connection. My problem is that I am unsure how to prevent the child
process from becoming defunct.
This problem is more appropriate for comp.unix.programmer.

A child process *ALWAYS* becomes defunct, at least briefly.
>Here is an over-simplified main
function...

int main(void) {

// Daemonize
int pid;
if ((pid = fork()) != 0) {
exit(0);
}
setsid();
if ((pid = fork()) != 0) {
exit(0);
}

// Assume this gets the socket descriptor, binds
// the socket and listens on given port.
int server_socket = create_server_socket(1234);

int client_socket;

while (1) {
// Assume this accepts a request to the server socket
client_socket = accept_socket_request(server_socket);

if (!fork()) {
// Child

// Assume this initiates a text interaction
// with the client, looping until the client
// enters 'exit'. Then it returns.
session();

// Close the client connection
shutdown(client_socket, 2);

// The child exits
exit(0);

} else {

// Parent
waitpid(-1, NULL, WNOHANG);
You might want to loop here until waitpid returns something other than
a process ID, to clean up multiple children at one time.
> }
}

// Close the server socket
shutdown(server_socket, 2);
return 0;
}

What is happening is that if a client terminates a child process the
parent isn't aware until a new connection/process is made. I think
this is because of my placement of waitpid(). The result is that
there is a defunct child sitting around until a new connection is
made, then the defunct process is cleaned up.
>There is always at
least 1 defunct process lying around.
Please explain why this is a problem. (Ever-increasing numbers of
defunct children are a problem, but that's not the issue here).
>How can I remedy this?
If you do not care about getting the status of a terminated child,
nor do you want to keep track of which children have terminated,
something like:

signal(SIGCHLD, SIG_IGN);
OR
signal(SIGCLD, SIG_IGN);

in the parent may be appropriate (chances are your system has only
one of these signals). Beware that passing this state on to a child
can make it malfunction if it has children and doesn't expect this,
so set the signal handling back to SIG_DFL after the fork() in the
child process.

Sep 11 '08 #2
On 11 Sep 2008 at 4:40, Gordon Burditt wrote:
>>There is always at least 1 defunct process lying around. How can I
remedy this?

If you do not care about getting the status of a terminated child,
nor do you want to keep track of which children have terminated,
something like:

signal(SIGCHLD, SIG_IGN);
OR
signal(SIGCLD, SIG_IGN);

in the parent may be appropriate (chances are your system has only
one of these signals).
It may be worth pointing out that pre-2001 versions of POSIX allowed
terminated child processes to become zombies even if the disposition of
SIGCHLD is set to SIG_IGN - I seem to recall that Linux up to 2.4.* had
this behavior.

Sep 11 '08 #3
Scottman wrote:
>
I am writing a server daemon that forks a child for every incoming
request. The child process terminates when the client closes the
connection. My problem is that I am unsure how to prevent the
child process from becoming defunct. Here is an over-simplified
main function...
The C language doesn't contain forks, child processes, etc. That
makes this off-topic on c.l.c. Try comp.unix.programmer.

--
[mail]: Chuck F (cbfalconer at maineline dot net)
[page]: <http://cbfalconer.home.att.net>
Try the download section.
Sep 11 '08 #4

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

3
by: Rob Hunter | last post by:
Hi all. I want to run a Python daemon that manages a "to-do" queue. I want it so that the daemon is always running, where its running consists of looking at the queue to see if it has any jobs,...
1
by: Bob Swerdlow | last post by:
I've created a Python daemon that starts a bunch of BitTorrent downloader process. Everything is working fine when I start the daemon by hand (logged on as root). I can quit the session and see...
1
by: Matt Stevens | last post by:
Hello, I'm having some trouble trying to get this simple forking http daemon to work, when I run it everything seems to run ok and then when I try to connect to it with a browser on another...
6
by: bcanavan | last post by:
Given a small number(maybe 4-5) of simulataneous remote users, can an app be run to provide "live" snapshot reports to snapviewer? If so, 1. Does the app have to run continuously? (I would...
3
by: felixfix | last post by:
Hi all, I am just wondering if something is wrong with my program. What it bascially does is to output a fibonacci sequence base on the command-line output. If I give a 5, it will generate the...
3
by: czajnik | last post by:
Hi! I'm quite new to Python development. Can someone advise me a framework useful for building (pre-)forking or threaded TCP servers, other than SocketServer ? I've seen source code of a few...
2
by: Reid Priedhorsky | last post by:
Hi folks, I am implementing a forking SocketServer daemon that maintains significant internal state (a graph that takes ~30s to build by fetching from a SQL database, and eventually further...
10
by: qwertycat | last post by:
I'm new to multi-process programming, should one avoid forking children from children of a parent? I'd like to spawn 10 children from the parent and each of those children spawns another 5...
6
by: Johny | last post by:
Is it possible to run a Python program as daemon? Thanks
0
by: abbasky | last post by:
### Vandf component communication method one: data sharing ​ Vandf components can achieve data exchange through data sharing, state sharing, events, and other methods. Vandf's data exchange method...
0
by: fareedcanada | last post by:
Hello I am trying to split number on their count. suppose i have 121314151617 (12cnt) then number should be split like 12,13,14,15,16,17 and if 11314151617 (11cnt) then should be split like...
0
by: stefan129 | last post by:
Hey forum members, I'm exploring options for SSL certificates for multiple domains. Has anyone had experience with multi-domain SSL certificates? Any recommendations on reliable providers or specific...
0
Git
by: egorbl4 | last post by:
Скачал я git, хотел начать настройку, а там вылезло вот это Что это? Что мне с этим делать? ...
1
by: davi5007 | last post by:
Hi, Basically, I am trying to automate a field named TraceabilityNo into a web page from an access form. I've got the serial held in the variable strSearchString. How can I get this into the...
0
by: MeoLessi9 | last post by:
I have VirtualBox installed on Windows 11 and now I would like to install Kali on a virtual machine. However, on the official website, I see two options: "Installer images" and "Virtual machines"....
0
by: DolphinDB | last post by:
The formulas of 101 quantitative trading alphas used by WorldQuant were presented in the paper 101 Formulaic Alphas. However, some formulas are complex, leading to challenges in calculation. Take...
0
by: DolphinDB | last post by:
Tired of spending countless mintues downsampling your data? Look no further! In this article, you’ll learn how to efficiently downsample 6.48 billion high-frequency records to 61 million...
0
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.