Differences in pthread behaviour glibc/uClibc

Vadim Lebedev vadim at mbdsys.com
Tue May 30 13:54:49 UTC 2006


Ralf Ertzinger wrote:

>Hi.
>
>I am currently trying to get asterisk to behave on OpenWRT (a linux
>distribution running on MIPS based WLAN routers, using 2.4 series
>kernels and uClibc).
>
>I have tracked down one problem to differences in thread behaviour
>between glibc (which asterisk was developed on) and uClibc. An very
>much boiled down example program follows:
>
>======================================
>#include <stdio.h>
>#include <pthread.h>
>#include <unistd.h>
>
>void *test(void *foo) {
>    pthread_attr_t attr;
>
>    // pthread_attr_init(&attr);
>    // pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
>
>    fprintf(stdout, "thread pid: %d\n", getpid());
>    for (;;) {
>        printf("from thread\n");
>        sleep(1);
>    }
>}
>
>main (int argc, char **argv, char **envp) {
>    pthread_t thr;
>    pthread_attr_t attr;
>
>    pthread_attr_init(&attr);
>    pthread_attr_setinheritsched(&attr, PTHREAD_INHERIT_SCHED);
>
>    fprintf(stdout, "main pid: %d\n", getpid());
>    pthread_create(&thr, &attr, &test, NULL);
>    printf("from main\n");
>    sleep(5);
>    execve("/bin/sh", argv, envp);
>    printf("post execve()\n");
>    return 1;
>}
>
>==================================
>This program, when run on Fedora Core/glibc shows the
>following:
>
>$ ./foo
>main pid: 26327
>from main
>thread pid: 26327
>from thread
>from thread
>from thread
>from thread
>from thread
>$
>
>
>
>On the OpenWRT platform the output is:
>
>root at OpenWRT:~# ./foo /bin/sh
>main pid: 1730
>thread pid: 1732
>from thread
>from main
>from thread
>from thread
>from thread
>from thread
>
>
>BusyBox v1.00 (2006.05.22-10:01+0000) Built-in shell (ash)
>Enter 'help' for a list of built-in commands.
>
>root at OpenWrt:~# from thread
>from thread
>from thread
>from thread
>[....]
>
>The "from thread" output continues until the shell spawned via execve()
>terminates. The thread created by the main program is not killed under
>uClibc when the main program executes execve(), while it is killed
>under glibc.
>
>Which behaviour is correct?
>
>  
>

Ralf could you try to replace execve(...)  by if (!vfork()) execve(...)?


Vadim

>Thanks in advance.
>_______________________________________________
>uClibc mailing list
>uClibc at uclibc.org
>http://busybox.net/cgi-bin/mailman/listinfo/uclibc
>
>
>
>  
>



More information about the uClibc mailing list