`
isiqi
  • 浏览: 16332944 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

用prctl给线程命名

阅读更多

对于多线程应用程序,如果能够给每个线程命名,那么调试起来的便利是不言而喻的。
今天看LWN上的周报,看到有人正在给prctl添加给进程内其它线程命名的接口,并从中得知,给线程自身命名的接口已经存在,不由窃喜,遂写下以下验证代码:

#include
#include
#include
void* tmain(void *arg)
{
char name[32];
prctl(PR_SET_NAME, (unsigned long)"xx");
prctl(PR_GET_NAME, (unsigned long)name);
printf("%s\n", name);
while (1)
sleep(1);
}
int main(void)
{
pthread_t tid;
pthread_create(&tid, NULL, tmain, NULL);
pthread_join(tid, NULL);
return 0;
}

编译并运行:

xiaosuo@gentux test $ gcc t_threadname.c -l pthread
xiaosuo@gentux test $ ./a.out
xx

在另一个终端,通过ps找到a.out的pid:

xiaosuo@gentux test $ ps aux | grep a.out
xiaosuo 29882 0.0 0.0 14144 544 pts/6 Sl+ 16:23 0:00 ./a.out

看命名是否奏效:

xiaosuo@gentux test $ cd /proc/29882/task/
xiaosuo@gentux task $ ls
29882 29883
xiaosuo@gentux task $ cd 29883/
xiaosuo@gentux 29883 $ cat cmdline
./a.outxiaosuo@gentux 29883 $

有点儿郁闷,cmdline显示的竟然还是./a.out。通过运行时打印的xx和strace检查prctl的返回值确认prctl确实成功运行。怀疑这个名字只能通过prctl获得,有点儿失落,可心仍不甘。查看ps的man,并实验,终于找到了"xx":

xiaosuo@gentux 29883 $ ps -L -p 29882
PID LWP TTY TIME CMD
29882 29882 pts/6 00:00:00 a.out
29882 29883 pts/6 00:00:00 xx

strace后知道这个“xx”竟然隐匿于stat和status:

xiaosuo@gentux 29883 $ cat stat
29883 (xx) S 7168 29882 7168 34822 29882 4202560 11 0 0 0 2 0 0 0 20 0 2 0 28515372 14483456 136 18446744073709551615 4194304 4196620 140735304261728 18446744073709551615 140435890519585 0 0 0 0 18446744071564503939 0 0 -1 1 0 0 0 0 0
xiaosuo@gentux 29883 $ cat status
Name: xx
State: S (sleeping)
Tgid: 29882
Pid: 29883
PPid: 7168
TracerPid: 0
Uid: 1000 1000 1000 1000
Gid: 1000 1000 1000 1000
FDSize: 256
Groups: 10 18 1000 1001 1005
VmPeak: 14144 kB
VmSize: 14144 kB
VmLck: 0 kB
VmHWM: 548 kB
VmRSS: 544 kB
VmData: 8388 kB
VmStk: 84 kB
VmExe: 4 kB
VmLib: 1528 kB
VmPTE: 32 kB
Threads: 2
SigQ: 1/40960
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000000
SigCgt: 0000000180000000
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: fffffffffffffeff
voluntary_ctxt_switches: 4447
nonvoluntary_ctxt_switches: 0

验毕!:)

分享到:
评论

相关推荐

    setthreadname.rar

    Linux内核本身并不提供直接的API来给线程命名,但是可以使用`prctl()`系统调用来设置进程或线程的名字。`prctl()`定义在`<sys/prctl.h>`头文件中,其基本用法如下: ```cpp #include <sys/prctl.h> #include ...

    Linux进程、线程和调度(2)

    当父进程或子进程中的任何一个试图修改这些共享的内存页时,内核才会真正进行拷贝,给修改者一个新的副本,而另一个进程仍然使用原页。这种技术可以减少不必要的内存复制,提高系统效率。 vfork()与fork()类似,但...

    gdb-thread-names:在没有内置线程名称支持的平台上从 proc 中提取线程名称的 Python 脚本

    关于这个脚本在 GDB 无法正确读取prctl(PR_SET_NAME, ...)和类似方法的情况下,此脚本可用于在 GDB 中通过从/proc中提取线程名称来设置线程名称。要求使用--with-python编译的(最近)版本的 GDB。安装要安装此脚本...

    linux 内存管理 start_kernel

    但物理内存管理是所有初始化中非常重要的一个环节,这是因为操作系统要正常运行,首先必须有一个良好的物理内存管理机制,以确保内存资源的合理分配和高效使用。 在start_kernel函数中,尽管内核初始化过程中涉及到...

    进程优先级处理

    在Unix/Linux系统中,C++可以使用`sys/prctl.h`头文件中的`prctl`函数来调整进程优先级。`nice`值是衡量进程优先级的一个指标,范围通常为-20(最高优先级)到19(最低优先级)。`setpriority`和`getpriority`函数...

    「杀不掉的」僵尸(zombie)进程

    - 使用`prctl(PR_SET_CHILD_SUBREAPER)`函数让某个进程成为子进程的subreaper,这样即使父进程退出,subreaper也会负责清理所有的子进程。 - 考虑使用容器化技术或虚拟化技术,将应用程序隔离在一个单独的环境中,...

    c语言做的一个任务管理器源码.zip

    1. **进程信息获取**:C语言中,可以使用`<sys/resource.h>`和`<unistd.h>`头文件中的系统调用来获取进程信息,如`getrusage`用于获取资源使用情况,`getpid`和`getppid`获取进程ID,`prctl`可以获取或设置进程属性...

    操作系统课程设计—任务管理器

    5. **系统调用**:如`ptrace`用于跟踪进程,`prctl`用于进程控制,`nice`和`renice`调整进程优先级等。理解这些系统调用的工作原理和使用场景。 6. **权限管理**:理解Linux的用户和组权限模型,以及如何在应用程序...

    测试CPU的程序.zip_cpu

    1. **系统调用**:为了获取CPU信息,程序可能使用了操作系统提供的系统调用,如在Unix-like系统中的`sysinfo()`或`prctl()`,或者在Windows系统中的`GetSystemInfo()`。 2. **CPUID指令**:CPUID是CPU提供的一种...

    linux C函数参考

    例如,`gettid`获取当前进程的线程ID,`prctl`进行进程控制操作,`syscalls`直接调用内核服务。 4. **文件I/O**:在Linux中,`<stdio.h>`库提供了文件操作的基本功能,如`fopen`、`fclose`、`fprintf`等。同时,`...

    cpp-GameMode实现按需优化Linux系统性能

    2. **系统调用**:使用`prctl`、`sched_setscheduler`等系统调用来改变进程调度参数。 3. **内核接口**:与内核进行交互,例如修改CPU频率,可能需要使用`/sys/class`或`/proc`目录下的文件系统接口。 4. **权限...

    Linux C库函数

    3. 进程和信号:`prctl()`允许对进程进行特定操作,`kill()`发送信号给进程,`signal()`处理信号。 4. 设备文件和驱动:`ioctl()`函数用于设备控制,常用于与硬件设备交互。 5. 软件定时器:`timer_create()`、`...

    劫持Linux系统调用封杀Core Dump漏洞攻击.pdf

    Linux 操作系统是当今最流行的操作系统之一,然而,Linux 系统调用 Core Dump 漏洞攻击的出现却给系统安全带来了巨大的威胁。 Core Dump 漏洞是 Linux 内核 2.6.15-2.6.17 中存在的一种漏洞,可以引发拒绝服务攻击...

    studying-strace

    program break 是数据段末尾的位置(实际上是它之后的第一个位置),将 program break 上移有给进程分配更多内存的效果,下移有解除分配的效果。 这就是 malloc 分配内存的方式。 ( ) arch_prctl() 设置特定于...

    禁用监一些个监控资源

    4. **利用系统调用**:在Linux下,我们可以使用`prctl()`系统调用来改变进程的行为,比如禁止某些信号处理,这可能会涉及到监控机制。而在Windows,我们可以使用`SetThreadPriority()`来调整线程优先级,间接影响...

    强力杀进程、保护进程、隐藏进程模块

    在实现这些功能时,开发者会使用操作系统提供的API函数,例如Windows API中的CreateProcess、TerminateProcess和SetProcessPrivileges,或者Linux的fork、execve和prctl等。同时,对于隐藏进程,可能涉及修改注册表...

    Unix编程常见问题解答

    **2.10.3 如何使用命名管道?** 一旦命名管道被创建,就可以像普通文件一样使用`open()`、`read()`、`write()`等函数进行读写操作。在写入数据之前,通常需要先打开管道。 **2.10.4 可以在命名管道上使用seek吗?*...

    创建进程时,指定父进程

    - 使用`prctl`系统调用的`PR_SET_PARENT`选项来改变进程的父进程ID(PID)。 - 或者在`fork`后,通过`CLONE_PARENT`标志调用`clone`,使新的子进程认为指定的进程是其父进程。 ### 5. 安全与风险 尽管指定父进程...

    Oracle Solaris 11 Introduction to Oracle Solaris11 Developer Env

    5. **Project Crossbow**:这是Oracle Solaris 11中网络虚拟化的一部分,通过网络命名空间和资源控制,为不同服务或应用提供隔离的网络环境,提高了网络性能和安全性。 6. **Solaris Studio**:这是一套集成开发...

    letmedebug:禁用ptrace的PT_DENY_ATTACH-修补ptrace系统调用

    在Linux系统中,可以使用`prctl`系统调用来设置或查看PT_DENY_ATTACH标志。例如,下面的C代码片段展示了如何在进程启动时禁止附加调试: ```c #include <sys/prctl.h> int main() { prctl(PR_SET_DUMPABLE, 0, 0,...

Global site tag (gtag.js) - Google Analytics