If there were are thread name then we could extend a kernel segv message
and the /proc/<pid>/task/<tid>/... entries by a TName value like this:
cat /proc/492/task/495/status
Name: test
TName: RX-Data <- this is the thread identification field
State: S (sleeping)
Tgid: 492
Pid: 495
PPid: 1
.
.
.
This will it make much easier to determinate which thread id is
associated to a logical thread.
It would be possible do this without add a new entry to the task_struct.
Just use the comm entry which is available, because it has the same
value as the group_leader->comm entry.
The only thing to do is to replace all task_struct->comm access by
task_struct->group_leader->comm to have the old behavior. This can be
eventually encapsulated by a macro.
The task_struct->comm of a non group_leader would be than the name of
the thread.
The only drawback is that there are a lot of files which must be
modified. A quick
find linux-2.6.30 -type f | xargs grep -l -e "->comm\>" | wc -l
shows 215 files. But this can be handled.
So i propose a new system call to give a thread a name.
What do you think?
Greetings,
Stefani
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majo...@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
On Tue, Jun 16, 2009 at 20:39, Stefani Seibold<ste...@seibold.net> wrote:
> Currently it is not easy to identify a thread in linux, because there is
> no thread name like in some other OS.
>
> If there were are thread name then we could extend a kernel segv message
> and the /proc/<pid>/task/<tid>/... entries by a TName value like this:
prctl(PR_SET_NAME, ...) works perfectly here.
Bert
/* -*- c -*- */
#define _GNU_SOURCE
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <stdbool.h>
#include <math.h>
#include <pthread.h>
#include <sys/prctl.h>
void *
thread(void *arg)
{
unsigned long i = (unsigned long)arg;
char comm[16];
snprintf(comm, sizeof comm, "task %02lu", i);
prctl(PR_SET_NAME, comm, 0l, 0l, 0l);
sleep(10);
return NULL;
}
int
main(int ac, char *av[])
{
pthread_t thr;
unsigned long i, n = 10;
char comm[16];
printf("%u\n", getpid());
sleep(5);
snprintf(comm, sizeof comm, "master");
prctl(PR_SET_NAME, comm, 0l, 0l, 0l);
sleep(5);
for (i = 0; i < n; i++)
pthread_create(&thr, NULL, thread, (void *)i);
pthread_join(thr, NULL);
return 0;
I checked it now a little bit more. It is true it works, but if i do a
segv access inside a thread a get the kernel message like:
task 09[17395]: segfault at 0 ip 08048612 sp b363c370 error 6 in
a.out[8048000+1000]
So the current implementation is not exactly what i expect. I would
prefer my solution to replace every access thread_struct->comm to
task_struct->group_leader->comm to have the right behavior.
The new system call is obsolete, it is still there.
> Hi,
>
> On Tue, Jun 16, 2009 at 20:39, Stefani Seibold<ste...@seibold.net> wrote:
> > Currently it is not easy to identify a thread in linux, because there is
> > no thread name like in some other OS.
> >
> > If there were are thread name then we could extend a kernel segv message
> > and the /proc/<pid>/task/<tid>/... entries by a TName value like this:
> prctl(PR_SET_NAME, ...) works perfectly here.
Oops, but man page describe another thing.
PR_SET_NAME
(Since Linux 2.6.9) Set the process name for the calling process
to arg2. ^^^^^^^^^^^^
Should we change man page? or change implementation?
I bet many developer assume the implementation is right.
> > More majordomo info at ?http://vger.kernel.org/majordomo-info.html
> > Please read the FAQ at ?http://www.tux.org/lkml/