我有一个pthread_t,我想改变它的CPU亲和力。 问题是我使用glibc 2.3.2,它没有pthread_setaffinity_np() 。 没关系,因为pthread_setaffinity_np()本身就是sched_setaffinity()的一个包装,可以通过传递线程ID而不是进程ID来设置任意线程的关联。 但是 … sched_setaffinity可以使用的线程ID是一个操作系统线程ID,可以从gettid()系统调用中获得。 这与opaquetypes的pthread_t不同 ,gettid()只会返回当前线程的thread-id。 我需要能够设置任意线程的CPU亲和力。 不幸的是,我不能访问pthread的私有部分,这会让我通过将pthread_t转换为struct pthread *来窃取线程id。 我猜,更好一些,因为依赖私有实现需要更多的麻烦。 我也一直在阅读pthread_getunique_np函数,但是这会返回一个“唯一的整型标识符” – 我不认为它是以任何forms或forms等同于操作系统线程ID。 因此,问题:我如何从任意pthread_t获得线程ID?
我读了LKD 1中的一些段落,我不能理解下面的内容: 从用户空间访问系统调用 通常,C库提供对系统调用的支持。 用户应用程序可以从标准头文件中获取函数原型,并与C库链接以使用系统调用(或者库函数,然后使用您的系统调用调用)。 但是,如果你只是写系统调用,glibc已经支持它了,这是值得怀疑的! 值得庆幸的是,Linux提供了一组包含访问系统调用的macros。 它设置寄存器内容并发出陷阱指令。 这些macros被命名为_syscall n () ,其中n在0和6之间。 该数字对应于传入系统调用的参数的数量,因为macros需要知道预期有多less个参数,并因此推入寄存器。 例如,考虑系统调用open() ,定义为 long open(const char *filename, int flags, int mode) 系统调用macros使用这个系统调用没有明确的库支持将是 #define __NR_open 5 _syscall3(long, open, const char *, filename, int, flags, int, mode) 然后,应用程序可以简单地调用open() 。 对于每个macros,有2 + 2×n个参数。 第一个参数对应于系统调用的返回types。 第二个是系统调用的名称。 接下来是按照系统调用的顺序跟随每个参数的types和名称。 __NR_open定义在<asm/unistd.h> ; 这是系统呼叫号码。 _syscall3macros通过内联汇编扩展为C函数; 程序集将执行上一节中讨论的步骤,将系统调用号和参数推入正确的寄存器,并发出软件中断以捕获到内核中。 将这个macros放在应用程序中是使用open()系统调用所需要的。 让我们编写macros来使用我们精彩的新foo()系统调用,然后编写一些testing代码来展示我们的努力。 #define __NR_foo 283 […]
任何人都可以解释如何malloc()内部工作? 我有时做strace program ,我看到很多sbrk系统调用,做man sbrk谈论它在malloc()使用,但没有更多。