[Top][All Lists]
[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
- pthread_create and EINTR,
Tom Carroll <=