Daemon Server, Forking, Defunct Processes

S

Scottman

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
 
A

Antoninus Twink

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.
 
C

CBFalconer

Scottman said:
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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads

Communicating between processes 0
Avoiding defunct processes 2
Linux: using "clone3" and "waitid" 0
Forking into the background (Linux) 1
C pipe 1
Error with server 3
forking a process 3
Forking ! 2

Members online

No members online now.

Forum statistics

Threads
473,764
Messages
2,569,565
Members
45,041
Latest member
RomeoFarnh

Latest Threads

Top