Problems with child comunicating with parent on fork()

Hello, I'm trying to implement a version of a bucketSort (kinda) server/client, but I'm having a VERY hard time on making the server behave correctly, when talking to the children, after it forks.
The server is kinda big (300+ lines), so I won't post it here, but here's what I'm doing.
1)create a pipe using

 int pipefd[2];
 if(pipe(pipefd)==-1){
    perror("pipe");
    exit(EXIT_FAILURE);
  }

2)all the socket(),bind(),listen() stuff
3)the main loop, now, here's the catch I think

int done = 0;
.
.
.
while(done!=1){
  clLen = sizeof(clAddr);
  if((clientsd=accept(serversd,(struct sockaddr *)&clAddr,&clLen)) == -1){
    perror("accept");
    close(serversd);
    exit(EXIT_FAILURE);
  }
  if((cpid = fork()) == -1){
      perror("fork");
      close(clientsd);
      close(serversd);
      exit(EXIT_FAILURE);
    }
    if(cpid==0){
     .
     .
     //It keeps reading for comands on a variable named cmd (this works)
     if(strncmp(cmd,"STOP",4)==0){
       write(pipefd[1],"1",1);
       _exit(0);
     }
     }else{
        close(clientsd);
        read(pipefd[0],&tmp,1);
        done=atoi(tmp);
     }
   }
}

Now, if I start this server and have only one connection, and this connection goes DIRECTLY sending a STOP signal, it works, but, if this connection does something else, or there's another connection (let's say a total of 9 connection for instance), then I have to send 9 diferent STOPs signals to actually kill the server. Where I want just to have to send 1 instead. Also, I want that if the client send some data, that the server acnowledges as being the last data it will ever recieve, to send a done to the main server and continue with all the rest (showing the data it recieved for instance). I thought that by using pipes and read/write on the pipe this would work, but as far as I could see, the read() function is a blocking function, and the main server keeps waiting for something to read, and this could be making some trouble?
I'm really out of ideias here, and really newbie when it comes to fork() and signals processing.
Sorry for the long post, does anyone knows what can possible be wrong? I can post the complete code somewhere over the net if somebody want's to help me.

Also, another question, is there any good way of debuging fork() programs?

Thanks a lot.

It would be nice to see the code from the fork() function onwards. From the posted code it seems that the parent and child process are both reading from the pipe. That is incorrect as the parent should write to the pipe while the child reads from it. Owing to the atomicity of the parent writes it is guaranteed that the child process waits for data to be written to the pipe before pulling it out from its end.

I'll post in my website ASAP, but isn't the pipe used for this?
I mean, if I write on the pipe, shouldn't the parent be able to read it normally?

Which process (parent / child) are you implying by this statement ... mean, if I write on the pipe

I meant that if the child write's on the pipe, isn't the father allowed to read from it? (any child).

Anyway, here's the code, sorry for the portuguese comentaries, but it should be easy to follow what's it up to.

Explain what the code is doing. One basic thing wrong with your code is that you cannot mix local and remote communication calls in the same code. Calls made to pipe() can't be in the same code space as socket() calls.

Hum, I think got a server like it finally right, if you could take a look at the code under EchoServer: Main Page , I think this code is correct tough right? At least it's working perfectly.
It's an ECHO server, simple, that when it receives the string "STOP SERVER\n" it echoes it, and kills the server, gracefully.
If this is correct (I still need to do some code cleaning), I may be rewriting the bucket sort server using this way as a guide line.

Thanks a lot.

Also, why I can't use pipe() and socket()???

You can. I guess Shamrock may have meant that you may run into data arrival issues in single threaded/process oriented code with blocking descriptors.

To avoid this you can either use non-blocking I/O, or polling, or both.

Yeah, non-blocking I/O was what I used on the Echo server.

Thanks all for the support :wink: