* sys_fork
@ 2005-11-26 17:06 HIToC
2005-11-26 17:23 ` sys_fork Ricardo Nabinger Sanchez
2005-11-26 19:26 ` sys_fork Claudio Fontana
0 siblings, 2 replies; 12+ messages in thread
From: HIToC @ 2005-11-26 17:06 UTC (permalink / raw)
To: linux-assembly
Hello list,
I have written a small echo program that listen for a TCP
incoming connection on a port, then send all data received.
This program can accept only a session at time: I would to
handle multiple connections using fork(), but in assembly this
way is little difficult!
How to hold the controll over the child genereted?
Can anyone help me?
Thanks for every suggestion.
--
With regards,
HIToC
hitoc_mail@yahoo.it
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: sys_fork
2005-11-26 17:06 sys_fork HIToC
@ 2005-11-26 17:23 ` Ricardo Nabinger Sanchez
2005-11-26 19:26 ` sys_fork Claudio Fontana
1 sibling, 0 replies; 12+ messages in thread
From: Ricardo Nabinger Sanchez @ 2005-11-26 17:23 UTC (permalink / raw)
To: linux-assembly
Quoting HIToC <hitoc_mail@yahoo.it>
Sent on Sat, 26 Nov 2005 18:06:03 +0100
> How to hold the controll over the child genereted?
with syscalls, like one would normally do with C/C++. :)
have a look under /usr/include/bits/syscall.h, and have fun!
Regards. :)
--
Ricardo Nabinger Sanchez
GNU/Linux #140696 [http://counter.li.org]
Slackware Linux + FreeBSD
Left to themselves, things tend to go from bad to worse.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: sys_fork
2005-11-26 17:06 sys_fork HIToC
2005-11-26 17:23 ` sys_fork Ricardo Nabinger Sanchez
@ 2005-11-26 19:26 ` Claudio Fontana
2005-11-27 18:22 ` sys_fork HIToC
1 sibling, 1 reply; 12+ messages in thread
From: Claudio Fontana @ 2005-11-26 19:26 UTC (permalink / raw)
To: HIToC; +Cc: linux-assembly
--- HIToC <hitoc_mail@yahoo.it> ha scritto:
> Hello list,
> I have written a small echo program that listen for
> a TCP
> incoming connection on a port, then send all data
> received.
>
> This program can accept only a session at time: I
> would to
> handle multiple connections using fork(),
also consider using select(2), which is syscall 82 or
poll (kernel 2.2+) which is 168 for descriptor
multiplexing to avoid process creation overhead.
> but in assembly this
> way is little difficult!
> How to hold the controll over the child genereted?
>
> Can anyone help me?
> Thanks for every suggestion.
Bye,
CLaudio
___________________________________
Yahoo! Mail: gratis 1GB per i messaggi e allegati da 10MB
http://mail.yahoo.it
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: sys_fork
2005-11-26 19:26 ` sys_fork Claudio Fontana
@ 2005-11-27 18:22 ` HIToC
2005-11-27 19:27 ` sys_fork Ricardo Nabinger Sanchez
0 siblings, 1 reply; 12+ messages in thread
From: HIToC @ 2005-11-27 18:22 UTC (permalink / raw)
To: Claudio Fontana; +Cc: linux-assembly
Using select(2) is a possible solution; but I am interested
to understand how to use the fork() system call..
For example, I wish to code in assembly language the
following C code [Beej's Guide to Network Programming]:
//...
while(1) { // main accept() loop
sin_size = sizeof(struct sockaddr_in);
if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1)
{
perror("accept");
continue;
}
if (!fork()) { // this is the child process
close(sockfd); // child doesn't need the listener
// do something with new_fd socket descriptor
close(new_fd);
exit(0);
}
close(new_fd); // parent doesn't need this
}
//...
My problem is to tell the OS to create a new child when
a connection is established.
HIToC
On Saturday 26 November 2005 20:26, Claudio Fontana wrote:
> --- HIToC <hitoc_mail@yahoo.it> ha scritto:
> > Hello list,
> > I have written a small echo program that listen for
> > a TCP
> > incoming connection on a port, then send all data
> > received.
> >
> > This program can accept only a session at time: I
> > would to
> > handle multiple connections using fork(),
>
> also consider using select(2), which is syscall 82 or
> poll (kernel 2.2+) which is 168 for descriptor
> multiplexing to avoid process creation overhead.
>
> > but in assembly this
> > way is little difficult!
> > How to hold the controll over the child genereted?
> >
> > Can anyone help me?
> > Thanks for every suggestion.
>
> Bye,
>
> CLaudio
>
>
>
>
>
>
>
> ___________________________________
> Yahoo! Mail: gratis 1GB per i messaggi e allegati da 10MB
> http://mail.yahoo.it
> -
> To unsubscribe from this list: send the line "unsubscribe linux-assembly"
> in the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
With regards,
HIToC
hitoc_mail@yahoo.it
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: sys_fork
2005-11-27 18:22 ` sys_fork HIToC
@ 2005-11-27 19:27 ` Ricardo Nabinger Sanchez
2005-11-28 10:10 ` sys_fork HIToC
0 siblings, 1 reply; 12+ messages in thread
From: Ricardo Nabinger Sanchez @ 2005-11-27 19:27 UTC (permalink / raw)
To: linux-assembly
Quoting HIToC <hitoc_mail@yahoo.it>
Sent on Sun, 27 Nov 2005 19:22:35 +0100
> My problem is to tell the OS to create a new child when
> a connection is established.
you'll have a loop blocking on accept(), with a call to fork() in the
body. the child will handle the connection, the parent will block again on
accept().
can you give more details on your problem? where are you stuck?
--
Ricardo Nabinger Sanchez
GNU/Linux #140696 [http://counter.li.org]
Slackware Linux + FreeBSD
Left to themselves, things tend to go from bad to worse.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: sys_fork
2005-11-27 19:27 ` sys_fork Ricardo Nabinger Sanchez
@ 2005-11-28 10:10 ` HIToC
2005-11-28 13:48 ` sys_fork Frank Kotler
2005-11-28 19:25 ` sys_fork Ricardo Nabinger Sanchez
0 siblings, 2 replies; 12+ messages in thread
From: HIToC @ 2005-11-28 10:10 UTC (permalink / raw)
To: Ricardo Nabinger Sanchez; +Cc: linux-assembly
I have thi piece of code:
wait_new_con: mov eax, [sock_fd]
mov ebx, their_addr
mov ecx, sockaddr_size
mov [their_addr_len], ecx
mov ecx, their_addr_len
push eax
push ebx
push ecx
call accept
test eax, eax
jns st_connection
mov ecx, accept_error
mov edx, accept_error_len
call print_string
mov ebx, 0x01
jmp exit
st_connection: mov [new_sock], eax ; new socket saved!
mov eax, 0x02 ; sys_fork
xor ebx, ebx
int 0x80
mov eax, 0x06 ; sys_close
mov ebx, [sock_fd]
int 0x80
echo_loop: mov eax, [new_sock]
mov ebx, buffer
push eax
push ebx
push dword MAX_DATA
push dword 0
call recv
push eax
mov edi, val
call hex2string
mov ecx, bytes
mov edx, bytes_len
call print_string
pop eax
cmp eax, 0x00000000
jz close_conct
mov ecx, eax
mov eax, [new_sock]
mov ebx, buffer
push eax
push ebx
push ecx
push dword 0
call send_all
jmp echo_loop
close_conct: mov eax, 0x06 ; sys_close
mov ebx, [new_sock]
int 0x80
mov eax, 0x01 ; sys_exit Child exit?
xor ebx, ebx
int 0x80
jmp wait_new_con
xor ebx, ebx
exit: mov eax, 0x01 ; sys_exit
int 0x80
When the caller has closed the TCP connection, I want that the child
exits, but happens that the entire program exits.
Also, if another client attemps to connect my server, the connecion is
refued.
On Sunday 27 November 2005 20:27, Ricardo Nabinger Sanchez wrote:
> Quoting HIToC <hitoc_mail@yahoo.it>
> Sent on Sun, 27 Nov 2005 19:22:35 +0100
>
> > My problem is to tell the OS to create a new child when
> > a connection is established.
>
> you'll have a loop blocking on accept(), with a call to fork() in the
> body. the child will handle the connection, the parent will block again on
> accept().
>
> can you give more details on your problem? where are you stuck?
--
With regards,
HIToC
hitoc_mail@yahoo.it
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: sys_fork
2005-11-28 10:10 ` sys_fork HIToC
@ 2005-11-28 13:48 ` Frank Kotler
2005-11-28 19:25 ` sys_fork Ricardo Nabinger Sanchez
1 sibling, 0 replies; 12+ messages in thread
From: Frank Kotler @ 2005-11-28 13:48 UTC (permalink / raw)
To: linux-assembly
HIToC wrote:
...
> mov eax, 0x02 ; sys_fork
> xor ebx, ebx
> int 0x80
I don't know much about socket programming, but I got sys_fork to work,
once... At this point, you're "two places at once". If eax=0, you're the
child (and want to do the echo_loop stuff, I guess). If eax is non-zero
- and positive, we hope! - you're the parent, and eax is the PID of the
child. In this case, I guess you want to jump back to the "accept" call.
By not checking eax at this point, *both* the parent and child fall
through into the echo_loop... and the sys_exit. At least, I *think*
that's what's happening...
or eax, eax ; or "test eax, eax"
js webefukt ; might be an error!
jnz wait_new_con ; parent
... ; child
See if something like that helps... There may be other things you need
to do, besides just going back to "accept" (probably should clean up
stack after the call?)...
Best,
Frank
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: sys_fork
2005-11-28 10:10 ` sys_fork HIToC
2005-11-28 13:48 ` sys_fork Frank Kotler
@ 2005-11-28 19:25 ` Ricardo Nabinger Sanchez
2005-11-29 18:59 ` sys_fork HIToC
1 sibling, 1 reply; 12+ messages in thread
From: Ricardo Nabinger Sanchez @ 2005-11-28 19:25 UTC (permalink / raw)
To: linux-assembly
Quoting HIToC <hitoc_mail@yahoo.it>
Sent on Mon, 28 Nov 2005 11:10:51 +0100
Hello,
as Frank said, you're not handling fork() result.
> st_connection: mov [new_sock], eax ; new socket
> saved!
>
> mov eax, 0x02 ; sys_fork
> xor ebx, ebx
> int 0x80
you should test here whether eax is < 0 (error), 0 (child) or > 0 (parent)
and act accordingly. but both processes are executing this right away:
>
> mov eax, 0x06 ; sys_close
> mov ebx, [sock_fd]
> int 0x80
and closing their listening socket (the one which is blocked on accept()).
do the program exit with error (EINVAL)?
--
Ricardo Nabinger Sanchez
GNU/Linux #140696 [http://counter.li.org]
Slackware Linux + FreeBSD
Left to themselves, things tend to go from bad to worse.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: sys_fork
2005-11-28 19:25 ` sys_fork Ricardo Nabinger Sanchez
@ 2005-11-29 18:59 ` HIToC
2005-11-30 0:20 ` sys_fork Ricardo Nabinger Sanchez
0 siblings, 1 reply; 12+ messages in thread
From: HIToC @ 2005-11-29 18:59 UTC (permalink / raw)
To: linux-assembly; +Cc: Konstantin Boldyshev
Yes, the problem was that I do not considered the value in EAX!
A possible solution to free system resources used by chlid, is to call
sys_waitpid with argument pid setted to 0 and waiting until the
value returned in EAX is greater than 0...
Now I understand some more thing over the fork system call!!
Thanks a lot!!
HIToC
On Monday 28 November 2005 20:25, Ricardo Nabinger Sanchez wrote:
> you should test here whether eax is < 0 (error), 0 (child) or > 0 (parent)
--
With regards,
HIToC
hitoc_mail@yahoo.it
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: sys_fork
2005-11-29 18:59 ` sys_fork HIToC
@ 2005-11-30 0:20 ` Ricardo Nabinger Sanchez
2005-11-30 4:00 ` sys_fork Robert Plantz
0 siblings, 1 reply; 12+ messages in thread
From: Ricardo Nabinger Sanchez @ 2005-11-30 0:20 UTC (permalink / raw)
To: linux-assembly
Quoting HIToC <hitoc_mail@yahoo.it>
Sent on Tue, 29 Nov 2005 19:59:56 +0100
Hello,
> Yes, the problem was that I do not considered the value in EAX!
> A possible solution to free system resources used by chlid, is to call
> sys_waitpid with argument pid setted to 0 and waiting until the
> value returned in EAX is greater than 0...
> Now I understand some more thing over the fork system call!!
that's nice, have you studied man 2 fork already? :)
I wouldn't recommend you to call wait4pid, because your process (the accept
() one) will block, and thus fork() will not be an advantage (you can do
that naturally without forking).
What would be a nice thing to do is to prepare a signal handler for
SIG_CHILD, to clean up its children. It is very single to use, all you
need is to tell the kernel to use your custom function for handling
SIG_CHILD, instead of the default action (which is to ignore the signal,
and you'll end with a bunch of zombies).
Btw, such a function is like this in C:
void handle_sigchild() {
wait();
}
notice that the process will not block, as the signal is being delivered
because of a terminating child. it will be cleaned even if the process is
blocked in accept().
I'm almost sure that you'll also need to handle interrupted accept(), which
will return -1 and errno will have EINTR (interrupted system call). in
this case, call accept() again :)
have fun :)
--
Ricardo Nabinger Sanchez
GNU/Linux #140696 [http://counter.li.org]
Slackware Linux + FreeBSD
Left to themselves, things tend to go from bad to worse.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: sys_fork
2005-11-30 0:20 ` sys_fork Ricardo Nabinger Sanchez
@ 2005-11-30 4:00 ` Robert Plantz
2005-11-30 10:26 ` sys_fork Ricardo Nabinger Sanchez
0 siblings, 1 reply; 12+ messages in thread
From: Robert Plantz @ 2005-11-30 4:00 UTC (permalink / raw)
To: linux-assembly
If you're going to use signals (a good idea), you should get a good book,
like
Stevens or Robbins & Robbins. The signal coverage in Robbins & Robbins
is more up to date than the orginial Stevens. I haven't seen the second
edition
of Stevens, but the descriptions say that signal coverage has been
expanded.
On Tue, 29 Nov 2005 16:20:13 -0800, Ricardo Nabinger Sanchez
<rnsanchez@terra.com.br> wrote:
> Quoting HIToC <hitoc_mail@yahoo.it>
> Sent on Tue, 29 Nov 2005 19:59:56 +0100
>
> Hello,
>
> I wouldn't recommend you to call wait4pid, because your process (the
> accept
> () one) will block, and thus fork() will not be an advantage (you can do
> that naturally without forking).
>
> What would be a nice thing to do is to prepare a signal handler for
> SIG_CHILD, to clean up its children. It is very single to use, all you
> need is to tell the kernel to use your custom function for handling
> SIG_CHILD, instead of the default action (which is to ignore the signal,
> and you'll end with a bunch of zombies).
>
> Btw, such a function is like this in C:
>
> void handle_sigchild() {
> wait();
> }
>
> notice that the process will not block, as the signal is being delivered
> because of a terminating child. it will be cleaned even if the process
> is
> blocked in accept().
>
> I'm almost sure that you'll also need to handle interrupted accept(),
> which
> will return -1 and errno will have EINTR (interrupted system call). in
> this case, call accept() again :)
>
> have fun :)
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: sys_fork
2005-11-30 4:00 ` sys_fork Robert Plantz
@ 2005-11-30 10:26 ` Ricardo Nabinger Sanchez
0 siblings, 0 replies; 12+ messages in thread
From: Ricardo Nabinger Sanchez @ 2005-11-30 10:26 UTC (permalink / raw)
To: linux-assembly
Quoting "Robert Plantz" <plantz@sonoma.edu>
Sent on Tue, 29 Nov 2005 20:00:21 -0800
> I haven't seen the second edition
> of Stevens, but the descriptions say that signal coverage has been
> expanded.
if you mean W. Richard Stevens, the second edition is up-to-date. and it's
very nice, the new authors made an excellent job.
--
Ricardo Nabinger Sanchez
GNU/Linux #140696 [http://counter.li.org]
Slackware Linux + FreeBSD
Left to themselves, things tend to go from bad to worse.
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2005-11-30 10:26 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-11-26 17:06 sys_fork HIToC
2005-11-26 17:23 ` sys_fork Ricardo Nabinger Sanchez
2005-11-26 19:26 ` sys_fork Claudio Fontana
2005-11-27 18:22 ` sys_fork HIToC
2005-11-27 19:27 ` sys_fork Ricardo Nabinger Sanchez
2005-11-28 10:10 ` sys_fork HIToC
2005-11-28 13:48 ` sys_fork Frank Kotler
2005-11-28 19:25 ` sys_fork Ricardo Nabinger Sanchez
2005-11-29 18:59 ` sys_fork HIToC
2005-11-30 0:20 ` sys_fork Ricardo Nabinger Sanchez
2005-11-30 4:00 ` sys_fork Robert Plantz
2005-11-30 10:26 ` sys_fork Ricardo Nabinger Sanchez
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).