Messages in this thread | | | Subject | Re: Invisible threads in 2.6.9 | From | Albert Cahalan <> | Date | 06 Oct 2004 20:21:38 -0400 |
| |
We do indeed have a kernel problem. I re-did the example code using the raw clone() system call, to avoid any pthreads troubles. I took out the busy loop; add it back in if you care to verify that it would indeed chew up CPU time.
(I started the threads stopped, so they wouldn't need to have distinct stacks.)
-------------------------- begin example --------------------------- $ ./zombie-leader $ ps -mfL UID PID PPID LWP C NLWP STIME TTY TIME CMD albert 3224 3223 - 0 1 Sep29 pts/19 00:00:00 bash albert - - 3224 0 1 Sep29 - 00:00:00 - albert 7442 1 - 0 9 20:05 pts/19 00:00:00 [zombie-leader] <defunct> albert 7457 3224 - 0 1 20:06 pts/19 00:00:00 xterm albert - - 7457 0 1 20:06 - 00:00:00 - albert 7475 3224 - 0 1 20:10 pts/19 00:00:00 ps -mfL albert - - 7475 0 1 20:10 - 00:00:00 - $ ls /proc/7442/task/ ls: /proc/7442/task/: No such file or directory $ ls /proc/7442/ ls: cannot read symbolic link /proc/7442/cwd: Permission denied ls: cannot read symbolic link /proc/7442/root: Permission denied ls: cannot read symbolic link /proc/7442/exe: Permission denied auxv cmdline cwd environ exe fd maps mem mounts root stat statm status task wchan $ ps -mo stat,ppid,pid,tid,nlwp,args STAT PPID PID TID NLWP COMMAND - 3223 3224 - 1 bash Ss - - 3224 1 - - 1 7442 - 9 [zombie-leader] <defunct> - 3224 7457 - 1 xterm S - - 7457 1 - - 3224 7477 - 1 ps -mo stat,ppid,pid,tid,nlwp,args R+ - - 7477 1 - ---------------------------- end example -------------------------------
////////////////////// begin code /////////////////////////// #include <sys/types.h> #include <unistd.h> #include <signal.h> #include <stdio.h> #include <sched.h>
#ifndef CLONE_THREAD #define CLONE_THREAD 0x00010000 #endif #ifndef CLONE_DETACHED #define CLONE_DETACHED 0x00400000 #endif #ifndef CLONE_STOPPED #define CLONE_STOPPED 0x02000000 #endif
// similar to NPTL pthreads, AFAIK #define FLAGS (CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_VM|CLONE_THREAD|CLONE_DETACHED)
static pid_t one;
static void die(int signo){ (void)signo; _exit(0); }
static void hang(void){ for(;;) pause(); }
static int clone_fn(void *vp){ (void)vp; hang(); return 0; // keep gcc happy }
static long clone_stack_data[2048]; #ifdef __hppa__ static long *clone_stack = &clone_stack_data[0]; #else static long *clone_stack = &clone_stack_data[2048]; #endif
int main(int argc, char *argv[]){ pid_t minime; int i = 8; (void)argc; (void)argv;
one = getpid(); signal(SIGHUP,die); if(fork()) hang(); // parent later killed as readyness signal
while(i--){ // better be stopped... they share a stack minime = clone(clone_fn, clone_stack, FLAGS | CLONE_STOPPED, NULL); if(minime==-1){ perror("no clone"); kill(one,SIGKILL); _exit(8); } }
kill(one,SIGHUP); // let the shell know we're ready
_exit(0); // make task group leader a zombie return 0; // keep gcc happy }
/////////////////////// end code /////////////////////////////
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |