我对用于描述 Linux 信号传递的术语感到困惑。大多数文本都会说“信号被传递到进程”或“信号被传递到线程”。
据我了解,当内核调用该处理程序时,信号被“传递”到驻留在进程中的信号处理程序。该进程本身是异步运行的,这个“交付”过程类似于 CPU 调用中断处理程序。中断处理程序(信号处理程序)不是进程线程,也不是该进程下运行的任何线程,对吗?它是由内核启动的一个单独的线程。
因此,信号不会传递给线程或进程,而是传递给驻留在进程中的信号处理程序,并且不一定与任何特定线程关联。如果这不正确,请告诉我,例如,信号处理程序和 pthread 之间的关联,它证明了“信号传递到 pthread”这一术语的合理性。
我运行iotop
以检查重度磁盘用户的程序,以防我需要降低它们的优先级。通常这已经足够了,但iotop
只显示线程 ID (TID),有时我想知道进程 ID (PID),以便我可以找到有关哪个进程负责的更多信息。
不幸的是,虽然ps
可以显示 TID(又名 SPID,LWP),但它没有一个标志来获取 TID 列表,就像处理带有--pid
. 我能做的最好的事情就是列出 TID,然后grep
是输出。例如,如果线程 id 是 792,我可以这样做
$ ps -eLf | grep ' 792 '
Run Code Online (Sandbox Code Playgroud)
这工作得相当好,但有点不优雅。
有没有更好的办法?
在将应用程序从 Linux 移植到 FreeBSD 期间,我遇到了以下问题。我需要获取应用程序中运行的所有线程的所有线程 ID。就 PThreads 而言,我需要一个数组实例,其中包含程序中的所有线程(PThreads 或 OpenMP)以向它们pthread_t
发送信号。pthread_signal
当前的 Linux 实现使用不可移植的解决方法,通过遍历 procfs 来获取进程的所有 pid:
int foreach_pid(void (*func)(pid_t, void *aux),void*aux){
DIR *proc_dir;
char dirname[256];
pid_t pid;
if ( ! func ) return -1;
snprintf(dirname, sizeof(dirname), "/proc/%d/task", getpid());
proc_dir = opendir(dirname);
if (proc_dir) {
/* /proc available, iterate through tasks... */
struct dirent *entry;
while ((entry = readdir(proc_dir)) != NULL) {
if(entry->d_name[0] == '.')
continue;
pid = atoi(entry->d_name);
func(pid, aux);
}
closedir(proc_dir);
return 0;
} else { …
Run Code Online (Sandbox Code Playgroud) 我的默认堆栈大小(根据 ulimit -s)是 8192 kB,所以当我尝试运行它时,自然会出现段错误下面的代码。此外,自然地,如果我执行'ulimit -s 9000',它可以正常工作。但是,当我执行 'ulimit -s unlimited' 时,代码再次出现段错误。任何想法这里发生了什么?
如果有用,我正在使用内核 4.19.0-6 和 gcc 版本 Debian 8.3.0-6 运行 Debian 10。
#include <iostream>
#include <unistd.h>
#include <cstdlib>
void* wait_exit(void*)
{
char bob[8193*1024];
return 0;
}
int main()
{
pthread_t t_exit;
int ret;
if((ret = pthread_create(&t_exit,NULL,wait_exit,NULL)) !=0)
{
std::cout<<"Cannot create exit thread: "<<ret<<std::endl;
}
std::cout<<"Made thread"<<std::endl;
sleep(5);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我想检查一下pthread_mutex_lock函数的使用情况,于是执行命令 man pthread_mutex_lock,结果出现No Manual Entry for pthread_mutex_lock。\n网上查了资料,说是有一个No Manual Entry for pthread_mutex_lock 的提示,需要安装manpages-posix-dev。
\n所以准备安装manpages-posix-dev \xef\xbc\x88 我执行命令:apt-get install manpages-posix-dev \xef\xbc\x89,但是E: 无法找到包 manpages-posix-dev再次提示我。为什么?我使用的是debian 10系统。
\ngyz@debian:~$ man pthread_mutex_lock\nNo manual entry for pthread_mutex_lock\ngyz@debian:~$ sudo apt-get install manpages-posix-dev\nReading package lists... Done\nBuilding dependency tree\nReading state information... Done\nE: Unable to locate package manpages-posix-dev\ngyz@debian:~$ lsb_release -a\nNo LSB modules are available.\nDistributor ID: Debian\nDescription: Debian GNU/Linux 10 (buster)\nRelease: 10\nCodename: buster\ngyz@debian:~$ getconf LONG_BIT\n64\ngyz@debian:~$ cat /proc/version\nLinux version 4.19.0-9-amd64 (debian-kernel@lists.debian.org) …
Run Code Online (Sandbox Code Playgroud)