bug in glibc?

Wayne Pinette Wpinette at tru.ca
Fri Jan 18 16:41:31 UTC 2008


Im sorry to say that the bug is  not in glibc, the bug is in your code/logic.

fork() is doing exactly what it is suppose to do in this case, this is why: 


from man fork : The fork() function shall create a new proces.  The new process shall be an exact copy of the calling process...and so on.

In your code : 

main()
{
        int a = 0;

        while (1) {
                printf("XXX(%d)",++a);  <--- AT this point the buffer is not flushed, it is still full
                (void) sleep(1);
                if (fork() == 0) { <0---- at the point fork is called, the buffer is still not flushed, it is full
                        printf("\n");  <-- at thsi point you flush the buffer, but you have flushed it off the first process, the copy has already been made, and was
                                                    made with a full buffer.
                        exit(0);
                }
        }
}

If you put the "\n" in the original printf statement :

 printf("XXX(%d)\n",++a);

You will have flushed the buffer BEFORE the fork and consequently before the exact copy of the process, and it will work the way you want it to.


Wayner


>>> Dr Alan J Bartlett <stxsl_ajb at hotmail.com> 18/01/2008 8:21 am >>>






KK,

I am running CentOS 5, update 1 ( == RHEL 5.1) and thought I would mimic your test.

$ uname -a
Linux stxsl 2.6.18-53.1.4.el5.stxsl #1 SMP Tue Jan 8 21:29:57 GMT 2008 i686 i686 i386 GNU/Linux
$ rpm -q glibc
glibc-2.5-18.el5_1.1
$ ldd zxc
        linux-gate.so.1 =>  (0x00343000)
        libc.so.6 => /lib/libc.so.6 (0x00b3d000)
        /lib/ld-linux.so.2 (0x0016e000)
$ cat zxc.c
#include        <stdio.h>
#include        <stdlib.h>
#include        <unistd.h>

main()
{
        int a = 0;

        while (1) {
                printf("XXX(%d)",++a);
                (void) sleep(1);
                if (fork() == 0) {
                        printf("\n");
                        exit(0);
                }
        }
}
$ ./zxc
XXX(1)
XXX(1)XXX(2)
XXX(1)XXX(2)XXX(3)
XXX(1)XXX(2)XXX(3)XXX(4)
XXX(1)XXX(2)XXX(3)XXX(4)XXX(5)
XXX(1)XXX(2)XXX(3)XXX(4)XXX(5)XXX(6)

$ 

You are not alone!

Regards,
Alan.


_________________________________________________________________
Free games, great prizes - get gaming at Gamesbox. 
http://www.searchgamesbox.com-- 
redhat-list mailing list
unsubscribe mailto:redhat-list-request at redhat.com?subject=unsubscribe 
https://www.redhat.com/mailman/listinfo/redhat-list





More information about the redhat-list mailing list