标签: pthreads

Linux 中信号是如何“传递”的?

我对用于描述 Linux 信号传递的术语感到困惑。大多数文本都会说“信号被传递到进程”或“信号被传递到线程”。

据我了解,当内核调用该处理程序时,信号被“传递”到驻留在进程中的信号处理程序。该进程本身是异步运行的,这个“交付”过程类似于 CPU 调用中断处理程序。中断处理程序(信号处理程序)不是进程线程,也不是该进程下运行的任何线程,对吗?它是由内核启动的一个单独的线程。

因此,信号不会传递给线程或进程,而是传递给驻留在进程中的信号处理程序,并且不一定与任何特定线程关联。如果这不正确,请告诉我,例如,信号处理程序和 pthread 之间的关联,它证明了“信号传递到 pthread”这一术语的合理性。

linux process kernel signals pthreads

43
推荐指数
3
解决办法
6526
查看次数

从 TID 获取 PID

我运行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)

这工作得相当好,但有点不优雅。

有没有更好的办法?

ps thread pthreads

11
推荐指数
1
解决办法
6187
查看次数

获取进程内运行的所有线程 ID 的可移植方法。

在将应用程序从 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)

linux freebsd c pthreads

6
推荐指数
1
解决办法
3210
查看次数

使用 pthread 无限堆栈大小

我的默认堆栈大小(根据 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)

segmentation-fault stack pthreads

3
推荐指数
1
解决办法
198
查看次数

为什么提示No Manual Entry for pthread_mutex_lock错误?

我想检查一下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系统。

\n
gyz@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)

man debian pthreads

1
推荐指数
1
解决办法
1291
查看次数

标签 统计

pthreads ×5

linux ×2

c ×1

debian ×1

freebsd ×1

kernel ×1

man ×1

process ×1

ps ×1

segmentation-fault ×1

signals ×1

stack ×1

thread ×1