bug-glibc
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

pthread_create and EINTR


From: Tom Carroll
Subject: pthread_create and EINTR
Date: Thu, 31 Jan 2002 14:44:15 -0500
User-agent: Mutt/1.3.26i

Goodday,

I have an unusual problem.  Upon pthread_create, the calling thread's errno
is modified to EINTR.  The behavior is unique to my glibc-linux systems;
errno is not modified on systems running freebsd or solaris, which I
believe is the expected behavior.

The linux systems that the code was tested on:

libc-2.2.4
Linux orbis.internal.chc-chimes.com 2.4.16 #1 Thu Dec 6 16:28:13 EST 2001 i686 
unknown

libc-2.2.2
Linux developer-tng 2.4.7-pre7-xfs #3 SMP Wed Jul 18 22:48:34 EDT 2001 i686 
unknown

libc-2.1.2
Linux coriolis 2.2.17 #2 SMP Wed Sep 20 16:12:34 Local time zone must be 
set--see zic mi686 i686 unknown

The following code illustrates the problem:

#define _REENTRANT

#include <errno.h>
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>

void *null_routine(void *arg)
{
        return(NULL);
}

int main(int argc,char *argv[])
{
        pthread_t tid;
        int rc;
        
        errno=0;
        rc=pthread_create(&tid,NULL,null_routine,NULL);
        printf("pthread_create - %d : %d\n",rc, errno);

        pthread_join(tid,NULL);

        return(0);
}

Executing the above code results in the following output:

pthread_create - 0 : 4

an strace follows:

execve("./pthread2", ["./pthread2"], [/* 35 vars */]) = 0
uname({sys="Linux", node="orbis.internal.chc-chimes.com", ...}) = 0
brk(0)                                  = 0x8049748
open("/etc/ld.so.preload", O_RDONLY)    = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=30162, ...}) = 0
old_mmap(NULL, 30162, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40016000
close(3)                                = 0
open("/lib/libpthread.so.0", O_RDONLY)  = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\260Q\0"..., 1024) = 
1024
fstat64(3, {st_mode=S_IFREG|0644, st_size=104744, ...}) = 0
old_mmap(NULL, 88216, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x4001e000
mprotect(0x4002c000, 30872, PROT_NONE)  = 0
old_mmap(0x4002c000, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 
0xd000) = 0x4002c000
close(3)                                = 0
open("/lib/libc.so.6", O_RDONLY)        = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0(\327\1"..., 1024) = 
1024
fstat64(3, {st_mode=S_IFREG|0755, st_size=1171196, ...}) = 0
old_mmap(NULL, 1187968, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x40034000
mprotect(0x4014c000, 41088, PROT_NONE)  = 0
old_mmap(0x4014c000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 
0x117000) = 0x4014c000
old_mmap(0x40152000, 16512, PROT_READ|PROT_WRITE, 
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x40152000
close(3)                                = 0
munmap(0x40016000, 30162)               = 0
getrlimit(0x3, 0xbffff90c)              = 0
setrlimit(RLIMIT_STACK, {rlim_cur=2044*1024, rlim_max=RLIM_INFINITY}) = 0
getpid()                                = 23309
uname({sys="Linux", node="orbis.internal.chc-chimes.com", ...}) = 0
rt_sigaction(SIGRTMIN, {0x40027228, [], 0x4000000}, NULL, 8) = 0
rt_sigaction(SIGRT_1, {0x400272b8, [], 0x4000000}, NULL, 8) = 0
rt_sigaction(SIGRT_2, {0x400273b8, [], 0x4000000}, NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [RTMIN], NULL, 8) = 0
_sysctl({{CTL_KERN, KERN_VERSION}, 2, 0xbffff714, 30, (nil), 0}) = 0
brk(0)                                  = 0x8049748
brk(0x8049778)                          = 0x8049778
brk(0x804a000)                          = 0x804a000
brk(0x804c000)                          = 0x804c000
pipe([3, 4])                            = 0
clone(child_stack=0x804b748, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND) 
= 23310
write(4, "address@hidden"..., 148) = 148
rt_sigprocmask(SIG_SETMASK, NULL, [RTMIN], 8) = 0
write(4, "address@hidden@\205\4\10\0\0\0\0\0\0\0\200\0"..., 148) = 148
rt_sigprocmask(SIG_SETMASK, NULL, [RTMIN], 8) = 0
rt_sigsuspend([] <unfinished ...>
--- SIGRTMIN (Real-time signal 0) ---
<... rt_sigsuspend resumed> )           = -1 EINTR (Interrupted system call)
sigreturn()                             = ? (mask now [RTMIN])
fstat64(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(136, 16), ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 
0x40016000
write(1, "pthread_create - 0 : 4\n", 23) = 23
write(4, "address@hidden@\205\4\10\336\250\0@"..., 148) = 148
write(4, "address@hidden@address@hidden"..., 148) = 148
rt_sigprocmask(SIG_SETMASK, NULL, [RTMIN], 8) = 0
rt_sigsuspend([] <unfinished ...>
--- SIGRTMIN (Real-time signal 0) ---
<... rt_sigsuspend resumed> )           = -1 EINTR (Interrupted system call)
sigreturn()                             = ? (mask now [RTMIN])
wait4(23310, NULL, __WCLONE, NULL)      = 23310
munmap(0x40016000, 4096)                = 0
_exit(0)                                = ?

Any help is greatly appreciated. 

Thanks,
-Tom Carroll



reply via email to

[Prev in Thread] Current Thread [Next in Thread]