Trouble with using fork()


 
Thread Tools Search this Thread
Top Forums Programming Trouble with using fork()
# 1  
Old 08-23-2006
Trouble with using fork()

Hello guys,

I m working on a chat program with C. I finished the iterative server and it's working well. But once I add fork(), I met problems. I cannot use close or exit, otherwise I cannot accept new connection in next loop. here is my code:


Code:
.
.
.
Listen(simpleSocket, 5);

signal(SIGCHLD, sigchld_handler);

/*****************************************************************/
while (1)
{
int tmpSock = 0;
int pid;
char buf[200] = "";
sendPack sp; /*struct traveling btw 3 programs*/
struct sockaddr_in clientName = { 0 };
int clientNameLength = sizeof(clientName);
int valUsr = 0, i = 0, status = 0;

/* wait here */
/*************************************************************/
simpleChildSocket = Accept(simpleSocket,
(struct sockaddr *)&clientName, &clientNameLength);
/*************************************************************/

if((pid = fork()) == 0)
{
/*if I close listen socket here, parent process cannot accept connection next time*/
close(simpleSocket);

returnStatus = Read(simpleChildSocket, &sp,
sizeof(sp));

if(sp.flag == 1)
{
/* printf("here we go: %s\n", sp.usrName); */
login(sp.usrName, simpleChildSocket, usrHead);

}
else if(sp.flag == 2)
{
if((tmpSock = judgeUser(usrHead, sp.usrName)))
{
status = 1;
Write(simpleChildSocket, &status, sizeof(int));
printf("Pass judgeUser.\n");
returnStatus = read(simpleChildSocket, &sp,
sizeof(sp));

if ( returnStatus > 0 ) {
printf("%d: %s", returnStatus, sp.usrName);
} else {
fprintf(stderr, "Return Status = %d \n", returnStatus);
}
while(sp.func != 4)
{
/*judge val of returnStatus inside func.*/
if(returnStatus > 0)
{
printf("Switch start..\n");
switch(sp.func)
{
case 1:
printf("Single send server.\n");
relaySingle(sp, usrHead, simpleChildSocket);
break;
case 2:
relayGroup(sp, usrHead, simpleChildSocket);
break;
case 3:
queryUsr(usrHead, simpleChildSocket);
break;
default :
break;
}

}
memset(&sp, '\0', sizeof(sp));
returnStatus = Read(simpleChildSocket, &sp,
sizeof(sp));
}
/*Delete quitting usrName.*/
sendQuit(usrHead, sp.usrName);
Write(tmpSock, &sp, sizeof(sp));
}
else
{
printf("You have not logged in yet.\n");
Write(simpleChildSocket, &status, sizeof(int));
}
}

/*If I use exit(0) or close child socket here, parent process cannot accept connection next time.*/
close(simpleChildSocket);
exit(0);
}

}

close(simpleSocket);
return 0;

}


Diring help~~

Cheers,

Elton
# 2  
Old 08-23-2006
could you please check once again that in the forking part
(pid_t = fork () ) == 0
/* child */
pid_t > 0
you dont call exit by mistake...

i have not gone through completely ...

if your accept is failing what is the errno?
# 3  
Old 08-23-2006
Thanku matrixmadhan,

It can accept connection before using fork(), but cause error at 2rd time. the error msg is :

In function Accept() :
accept() : returned -1, errno=EINTR (Interrupted system call)
parameters : s = 3
addr = ffbff4b8
addrlen = ffbff4b4
(*addrlen = 16 before call, 16 after call)
From the man page:
accept() will fail if:
EINTR The accept attempt was interrupted by
the delivery of a signal.



Cheers,

Elton
# 4  
Old 08-23-2006
For simple stream server stub look at http://beej.us/guide/bgnet/output/ht...l#simpleserver
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Programming

Fork!

I understand that fork create a child but I need very simple example that make child useful.... I mean how will make the program faster anyone explain with code plz using C plz (2 Replies)
Discussion started by: fwrlfo
2 Replies

2. UNIX for Dummies Questions & Answers

fork()

I'm trying to run a simple test on how to use fork(), i'm able to execute the child process first then the parent, but how can I execute parent then child..? Thanks! (1 Reply)
Discussion started by: l flipboi l
1 Replies

3. Programming

Fork and \n

Hi, I wrote a simple program for understanding the fork command. The code is as below int main(void) { fork(); printf("hi 1 \n"); fork(); printf("hi 2 \n"); fork(); printf("hi 3 \n"); } I am getting a variation in the number of times the printf is called if i remove the \n from each... (2 Replies)
Discussion started by: xyz123456
2 Replies

4. UNIX for Advanced & Expert Users

Fork and \n

Hi, I wrote a simple program for understanding the fork command. The code is as below int main(void) { fork(); printf("hi 1 \n"); fork(); printf("hi 2 \n"); fork(); printf("hi 3 \n"); } I am getting a variation in the number of times the printf is called if i remove the \n from each of... (1 Reply)
Discussion started by: xyz123456
1 Replies

5. Programming

fork() help

Hi everybody, I wanna write a code to understand how fork works. my target -------------- -Parent creates a file(called temp) and writes into this file "1".Then it closes the file. -Then parent creates a child and wait until execution of this child ends. -Then child opens the same... (3 Replies)
Discussion started by: alexicopax
3 Replies

6. Programming

Fork ()

hi all About this code for (i = 1; i < n; i++) if ((childpid = fork()) <= 0) break; I really can't understand the output . and the way fork () return the value . how about the process Id ,the child process Id and the parent ID in this case so please answer me soon (5 Replies)
Discussion started by: iwbasts
5 Replies

7. Programming

Fork or what?

Hello all. I'm developing a filetransfer application, which is supposed to work sort of like dcc, with multiple transfers etc. Now i wonder what the best way to manage the transfers is. Should i fork() for each new transfer, hogging loads of memory or use pthreads? Maybe I can use select to see... (0 Replies)
Discussion started by: crippe
0 Replies

8. Programming

fork()

#include <stdio.h> #include <string.h> #include <sys/types.h> #define MAX_COUNT 200 #define BUF_SIZE 100 void main(void) { pid_t pid; int i; char buf; fork(); pid = getpid(); for (i = 1; i <= MAX_COUNT; i++) { sprintf(buf,... (2 Replies)
Discussion started by: MKSRaja
2 Replies

9. Programming

fork() fd

I run this code, actually I want to both processes print the message from "data". But only one does. What happens? Anyone can help? #include <stdio.h> main(){ int fd, pid; char x; fd = open("data",0); /* open file "data" */ pid = fork(); if(pid != 0){ wait(0); ... (2 Replies)
Discussion started by: Herman
2 Replies

10. UNIX for Dummies Questions & Answers

Fork

What is a fork? Why would one create a fork? What are the advantages and disadvantages of using a fork? Please advise. Thank You. Deepali (5 Replies)
Discussion started by: Deepali
5 Replies
Login or Register to Ask a Question