对于多线程应用程序,如果能够给每个线程命名,那么调试起来的便利是不言而喻的。
今天看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
验毕!:)
分享到:
相关推荐
Linux内核本身并不提供直接的API来给线程命名,但是可以使用`prctl()`系统调用来设置进程或线程的名字。`prctl()`定义在`<sys/prctl.h>`头文件中,其基本用法如下: ```cpp #include <sys/prctl.h> #include ...
当父进程或子进程中的任何一个试图修改这些共享的内存页时,内核才会真正进行拷贝,给修改者一个新的副本,而另一个进程仍然使用原页。这种技术可以减少不必要的内存复制,提高系统效率。 vfork()与fork()类似,但...
关于这个脚本在 GDB 无法正确读取prctl(PR_SET_NAME, ...)和类似方法的情况下,此脚本可用于在 GDB 中通过从/proc中提取线程名称来设置线程名称。要求使用--with-python编译的(最近)版本的 GDB。安装要安装此脚本...
但物理内存管理是所有初始化中非常重要的一个环节,这是因为操作系统要正常运行,首先必须有一个良好的物理内存管理机制,以确保内存资源的合理分配和高效使用。 在start_kernel函数中,尽管内核初始化过程中涉及到...
在Unix/Linux系统中,C++可以使用`sys/prctl.h`头文件中的`prctl`函数来调整进程优先级。`nice`值是衡量进程优先级的一个指标,范围通常为-20(最高优先级)到19(最低优先级)。`setpriority`和`getpriority`函数...
- 使用`prctl(PR_SET_CHILD_SUBREAPER)`函数让某个进程成为子进程的subreaper,这样即使父进程退出,subreaper也会负责清理所有的子进程。 - 考虑使用容器化技术或虚拟化技术,将应用程序隔离在一个单独的环境中,...
1. **进程信息获取**:C语言中,可以使用`<sys/resource.h>`和`<unistd.h>`头文件中的系统调用来获取进程信息,如`getrusage`用于获取资源使用情况,`getpid`和`getppid`获取进程ID,`prctl`可以获取或设置进程属性...
5. **系统调用**:如`ptrace`用于跟踪进程,`prctl`用于进程控制,`nice`和`renice`调整进程优先级等。理解这些系统调用的工作原理和使用场景。 6. **权限管理**:理解Linux的用户和组权限模型,以及如何在应用程序...
1. **系统调用**:为了获取CPU信息,程序可能使用了操作系统提供的系统调用,如在Unix-like系统中的`sysinfo()`或`prctl()`,或者在Windows系统中的`GetSystemInfo()`。 2. **CPUID指令**:CPUID是CPU提供的一种...
例如,`gettid`获取当前进程的线程ID,`prctl`进行进程控制操作,`syscalls`直接调用内核服务。 4. **文件I/O**:在Linux中,`<stdio.h>`库提供了文件操作的基本功能,如`fopen`、`fclose`、`fprintf`等。同时,`...
2. **系统调用**:使用`prctl`、`sched_setscheduler`等系统调用来改变进程调度参数。 3. **内核接口**:与内核进行交互,例如修改CPU频率,可能需要使用`/sys/class`或`/proc`目录下的文件系统接口。 4. **权限...
3. 进程和信号:`prctl()`允许对进程进行特定操作,`kill()`发送信号给进程,`signal()`处理信号。 4. 设备文件和驱动:`ioctl()`函数用于设备控制,常用于与硬件设备交互。 5. 软件定时器:`timer_create()`、`...
Linux 操作系统是当今最流行的操作系统之一,然而,Linux 系统调用 Core Dump 漏洞攻击的出现却给系统安全带来了巨大的威胁。 Core Dump 漏洞是 Linux 内核 2.6.15-2.6.17 中存在的一种漏洞,可以引发拒绝服务攻击...
program break 是数据段末尾的位置(实际上是它之后的第一个位置),将 program break 上移有给进程分配更多内存的效果,下移有解除分配的效果。 这就是 malloc 分配内存的方式。 ( ) arch_prctl() 设置特定于...
4. **利用系统调用**:在Linux下,我们可以使用`prctl()`系统调用来改变进程的行为,比如禁止某些信号处理,这可能会涉及到监控机制。而在Windows,我们可以使用`SetThreadPriority()`来调整线程优先级,间接影响...
在实现这些功能时,开发者会使用操作系统提供的API函数,例如Windows API中的CreateProcess、TerminateProcess和SetProcessPrivileges,或者Linux的fork、execve和prctl等。同时,对于隐藏进程,可能涉及修改注册表...
**2.10.3 如何使用命名管道?** 一旦命名管道被创建,就可以像普通文件一样使用`open()`、`read()`、`write()`等函数进行读写操作。在写入数据之前,通常需要先打开管道。 **2.10.4 可以在命名管道上使用seek吗?*...
2. **工具脚本**:PostGIS附带了许多命令行工具,如`pgsql2shp`和`shp2pgsql`,它们可能是用Perl编写的,用于在PostGIS和Shapefile之间进行数据交换。 3. **系统管理**:Perl在Linux运维中广泛使用,可能用于自动化...
- 使用`prctl`系统调用的`PR_SET_PARENT`选项来改变进程的父进程ID(PID)。 - 或者在`fork`后,通过`CLONE_PARENT`标志调用`clone`,使新的子进程认为指定的进程是其父进程。 ### 5. 安全与风险 尽管指定父进程...
5. **Project Crossbow**:这是Oracle Solaris 11中网络虚拟化的一部分,通过网络命名空间和资源控制,为不同服务或应用提供隔离的网络环境,提高了网络性能和安全性。 6. **Solaris Studio**:这是一套集成开发...