Fork a child process???Howto?


I have written a module to do socket programming. The module resides in UNIX server. It will listen to a port and response to client request. Basically, I have completed the basic functions.

The server process will accept input from client (NT) and process the data accordingly and then write back to the client the end result.

So, I need to create some sort like a server daemon ...

First, the server process will be started. Any request from client will be served by a child process spawned from the parent process. The child process will send the end result to client upon finishing the data (input from client) processing and exit. Meanwhile the server will listen to the next request.

Pls refer any useful links / examples in order for me to achive this.

Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

qiang8Author Commented:
My main question is how to create a daemon that is able to serve the clients' request ... Thanks.
qiang8Author Commented:
Can I use popen to carry out something after fork process??? All examples that I have seen are using execlp or execvp ... Pls advise and thanks.
You need to fork() your parent process. After this is called, the newly forked process will be an exact copy of the parent process. You can therefore use the data to service the request. It is necessary after the fork to check whether you are in the parent, in which case you go on to listen for more requests, or whether you are in the child, in which case you service the request and _exit.

To find out whether you are in the child or the parent, check the return value of fork(), i.e.

int iReturnCode = fork();

if(-1 == iReturnCode)
     //The process has failed to fork....
else if(0 == iReturnCode)
     //We are in the child process
     //Service the request....
     //We are in the parent and iReturnCode is the
     //process id of the child...
     //Continue listening for new requests....

Hope this helps.
HTML5 and CSS3 Fundamentals

Build a website from the ground up by first learning the fundamentals of HTML5 and CSS3, the two popular programming languages used to present content online. HTML deals with fonts, colors, graphics, and hyperlinks, while CSS describes how HTML elements are to be displayed.

Yes. You only need to call exec (whatever variant) if you want to start a totally new executable. e.g. if you have one executable listening for a request, call it WaitForRequest and another that services requests, call it ServiceRequest, then you have to call exec to start Service request. Otherwise, if it is all done in the same executable, but you check to see which part of the code will be executed next by checking whether you are in the parent or child, then exec does not have to be called.
qiang8Author Commented:
I have tried the fork process with popen (I save the output to a buffer, pointed to by a file pointer) and successfully. So, my main concern is how to create daemon which will be started automatically upon activation. Any examples on the internet is appreciated. Any example on exec is welcome too.

Sorry for not making the question clear at the beginning. Thanks.
The best way to get your main server process to start automatically is to use inetd. With this you can set the internet daemon to listen on a specific port and when a message is sent to that port inetd will start up a pre-defined application (in this case your main server app).

To do this you will have to modify a couple of files. First, you will need to modify the inetd.conf file. This is usually /etc/inetd.conf but if it is not there you can use the UNIX whereis command to find it. In this file you need to add service name, socket type, protoco, {wait|nowait}[/max-child[/max-connections-per-ip-per-minute]], user[:group][/login-class], server program, server program arguments. Just follow the format of the other entries in this file.

You must also edit the /etc/services to add the name of your service.

For more information look up inetd in the UNIX man pages or, if you haven't got then, which I haven't :(, follow this link:

Hopefully this will help.


Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
Dear qiang8

I think you forgot this question. I will ask Community Support to close it unless you finalize it within 7 days. You can always request to keep this question open. But remember, experts can only help you if you provide feedback to their questions.
Unless there is objection or further activity,  I will suggest to accept


comment(s) as an answer.

It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today

From novice to tech pro — start learning today.