linux 如何获得正在运行程序的pid

linux 如何获得正在运行程序的pid,第1张

你用了pthread库,在链接的时候要加上

gcc

-lpthread

1.c

-o

1

即可

进程(对应pid==0语句)调用pthread接口创建线程,在县城内将value赋值5,然后打印

child:

value=%d\n

此时value

=

5

父进程

(对应

pid

>

0

语句),等待子进程执行完成后(wait语句),打印parent:

value=%d\n

,此时value

=

0

对于你补充问题的回答:

线程是在子进程里创建的,它只改变了子进程的value

(子进程和父进程的value处在不同的地址空间,互相没有关系,而子进程和它所创建的线程是在同一地址空间,所以线程可以改变子进程的value),

父进程没有创建线程,因此它的值不会被改变。

通过查看资料,发现一种比较简单的方法就是在代码中使用printf将当前线程的id打印出来。

而这也分成两种情况:

1. 如果是pthread,则使用,

#include <pthread.h>

pthread_t pthread_self(void)

2. 如果不是pthread,即是由内核创建的线程,则使用,

#include <sys/types.h>

pid_t gettid(void)

获取线程所在的进程的id,方法如下:

#include <sys/types.h>

#include <unistd.h>

pid_t getpid(void)

pid_t getppid(void)

所以,我们在代码中使用如下的语句打印:

printf("\ntid=%lu, pid=%lu\n", gettid(), getpid())

这样就能获取当前代码所在的线程和进程了。

根据打印出来的进程的pid,获取进程名的方法是:

ls -lh /proc/pid/exe

lrwxrwxrwx 1 root root 0 Jan 1 20:48 /proc/pid/exe ->...

sh-3.2#

查看thread id的方法有:

1. sh-3.2# ps -efL | grep process,

ps命令指定-L命令选项可以用来查看进程下所包含的所有线程。

2. sh-3.2# ls -l /proc/pid/task/

查看进程下当前有哪些task,这些task指的就是线程。

用管道:

通过fgets(buf, n, ptr)buf就可以得到命令“ps -ef"一样的信息,

读帮助”man popen":

char *cmd = "ps -ef"

FILE *ptr

if ((ptr = popen(cmd, "r")) != NULL)

while (fgets(buf, n, ptr) != NULL)

(void) printf("%s ",buf)

UID PID PPID CSTIME TTYTIME CMD

root 0 0 0 Sep-30 ?00:00:01 sched

root 1 0 0 Sep-30 ?00:00:06 /etc/init -a

root 2 0 0 Sep-30 ?00:00:00 vhand

root 3 0 0 Sep-30 ?00:00:27 bdflush

root 4 0 0 Sep-30 ?00:00:00 kmdaemon

root 5 1 0 Sep-30 ?00:00:50 htepi_daemon /

root 6 0 0 Sep-30 ?00:00:00 strd

root 2941 1 0 Oct-08 tty0100:00:00 /bin/login ccb

root43 1 0 Oct-08 ?00:00:02 /etc/syslogd

root47 1 0 Oct-08 ?00:00:00 /etc/ifor_pmd

root4847 0 Oct-08 ?00:00:13 /etc/ifor_pmd

root36 1 0 Oct-08 ?00:00:00


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8076716.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-13
下一篇2023-04-13

发表评论

登录后才能评论

评论列表(0条)

    保存