Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > Daemon Server, Forking, Defunct Processes

Reply
Thread Tools

Daemon Server, Forking, Defunct Processes

 
 
Scottman
Guest
Posts: n/a
 
      09-11-2008
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
 
Reply With Quote
 
 
 
 
Antoninus Twink
Guest
Posts: n/a
 
      09-11-2008
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.

 
Reply With Quote
 
 
 
 
CBFalconer
Guest
Posts: n/a
 
      09-11-2008
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.
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Avoiding defunct processes Richard Python 2 11-02-2012 03:46 PM
Defunct Processes With subprocess.Popen John Abel Python 2 05-12-2005 07:53 AM
Script to kill defunct and zombie processes Srini Vuggumudi Perl Misc 4 05-01-2004 12:14 AM
Script to kill defunct and zombie processes Srini Vuggumudi Perl Misc 0 04-29-2004 07:53 PM
<defunct> processes Gordon Beaton Java 4 11-07-2003 06:18 PM



Advertisments