如何查看正在创建线程的正在运行的进程的线程?

如何查看正在创建线程的正在运行的进程的线程?

我编写了一个非常小的程序,它创建两个线程:

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>

void *start()
{
        printf("Am a new thread!\n");
        printf("%d\n",pthread_self());
}

void main()
{

        pthread_t thread_id1;
        pthread_t thread_id2;

        pthread_create(&thread_id1,NULL,start,NULL);
        pthread_create(&thread_id2,NULL,start,NULL);
        //pthread_join(thread_id,NULL);
        sleep(30);

}

当我编译并运行程序时:

gcc create.c -lpthread
./a.out

我打开一个新终端并尝试查看线程,这就是我得到的:

ps -efL | grep a.out
root      1943 20158  1943  0    1 15:25 pts/4    00:00:00 ./a.out
root      1985  1889  1985  0    1 15:25 pts/5    00:00:00 grep --color=auto a.out

那么为什么我在这里看不到两个线程 id 呢?

答案1

两个附加线程写入消息并终止,因此您没有时间使用 来查看它们ps

man pthread_create:

新线程以下列方式之一终止:

* 它调用 pthread_exit(3),指定退出状态值,该值可供调用 pthread_join(3) 的同一进程中的另一个线程使用。

* 它从 start_routine() 返回。这相当于使用 return 语句中提供的值调用 pthread_exit(3)。

[...]

您可以通过以下方式跟踪正在发生的事情strace

$ strace -f -e trace=clone,exit ./a.out 
clone(strace: Process 409 attached
child_stack=0x7f7126930ff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7f71269319d0, tls=0x7f7126931700, child_tidptr=0x7f71269319d0) = 409
[pid   408] clone(strace: Process 410 attached
child_stack=0x7f712612fff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7f71261309d0, tls=0x7f7126130700, child_tidptr=0x7f71261309d0) = 410
Am a new thread!
Am a new thread!
647173888
638781184
[pid   409] exit(0 <unfinished ...>
[pid   410] exit(0 <unfinished ...>
[pid   409] <... exit resumed>)         = ?
[pid   410] <... exit resumed>)         = ?
[pid   410] +++ exited with 0 +++
[pid   409] +++ exited with 0 +++

相关内容