Как я могу получить PID Linux для потока? - PullRequest
1 голос
/ 21 мая 2019

Я заинтересован в получении PID потока, созданного в программе Rust.Как указано в документации , thread::id() не работает для этой цели.Я нашел Получить текущий идентификатор потока и идентификатор процесса в виде целых чисел? это выглядело как ответ, но мои эксперименты показывают, что это не работает.

Это код:

extern crate rand;
extern crate libc;

use std::thread::{self, Builder};
use std::process::{self, Command};
use rand::thread_rng;
use rand::RngCore;
use std::time::Duration;
use std::os::unix::thread::JoinHandleExt;
use libc::pthread_t;

fn main() {
    let main_pid = process::id();
    println!("This PID {}", main_pid);

    let b = Builder::new().name(String::from("LongRunningThread")).spawn(move || {
        let mut rng = thread_rng();
        let spawned_pid = process::id();
        println!("Spawned PID {}", spawned_pid);
        loop {
            let u = rng.next_u64() % 1000;
            println!("Processing request {}", u);
            thread::sleep(Duration::from_millis(u));
        }

    }).expect("Could not spawn worker thread");

    let p_threadid : pthread_t = b.as_pthread_t();
    println!("Spawned p_threadid {}", p_threadid);
    let thread_id = b.thread().id();
    println!("Spawned thread_id {:?}", thread_id);

    thread::sleep(Duration::from_millis(60_000));
}

Результат запуска программы на компьютере с Linux следующий:

This PID 8597
Spawned p_threadid 139858455706368. <-- Clearly wrong
Spawned thread_id ThreadId(1) <-- Clearly wrong
Spawned PID 8597
Processing request 289
Processing request 476
Processing request 361
Processing request 567

Ниже приведен отрывок из вывода htop в моей системе:

 6164  1026 root       20   0   98M  7512  6512 S  0.0  0.0  0:00.03 │  ├─ sshd: dash [priv]
 6195  6164 dash       20   0   98M  4176  3176 S  0.0  0.0  0:00.20 │  │  └─ sshd: dash@pts/11
 6196  6195 dash       20   0 22964  5648  3408 S  0.0  0.0  0:00.09 │  │     └─ -bash
 8597  6196 dash       20   0  2544     4     0 S  0.0  0.0  0:00.00 │  │        └─ ./process_priorities
 8598  6196 dash       20   0  2544     4     0 S  0.0  0.0  0:00.00 │  │           └─ LongRunningThre

PID, который я хочу получить от порожденного потока, - 8598, но я не могу понять, как получить его в программе Rust.Есть идеи?

1 Ответ

0 голосов
/ 21 мая 2019

Я нашел ответ, используя существующий ящик под названием Palaver .Он включает gettid(), который работает на разных платформах.Единственное предостережение в том, что в конфигурации ящика по умолчанию используются ночные функции, поэтому, если вы работаете в стабильном режиме, обязательно отключите их следующим образом palaver = { version = "*", default-features = false }

Теперь, когда я запускаю код, который использует gettid(), это вывод:

This PID 9009
Priority changed for thread
Spawned PID 9010
Processing request 803
Processing request 279
Processing request 624

И вывод из моего htop:

 6164  1026 root       20   0   98M  7512  6512 S  0.0  0.0  0:00.03 │  ├─ sshd: dash [priv]
 6195  6164 dash       20   0   98M  4176  3176 S  0.0  0.0  0:00.21 │  │  └─ sshd: dash@pts/11
 6196  6195 dash       20   0 22964  5648  3408 S  0.0  0.0  0:00.10 │  │     └─ -bash
 9009  6196 dash       20   0  2544     4     0 S  0.0  0.0  0:00.00 │  │        └─ ./process_priorities
 9010  6196 dash       20   0  2544     4     0 S  0.0  0.0  0:00.00 │  │           └─ LongRunningThre
...