亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: linux下怎樣查看多線程程序的主線程pid? [打印本頁]

作者: teclimber    時(shí)間: 2011-06-09 19:03
標(biāo)題: linux下怎樣查看多線程程序的主線程pid?
我有一個(gè)進(jìn)程,他里面有幾個(gè)線程。我知道這個(gè)進(jìn)程的名字,現(xiàn)在我想通過進(jìn)程的名字來查看這個(gè)進(jìn)程的主線程的pid,改怎么辦?linux下有什么命令嗎?
我用pidof 名字可以查看,但是查看的是該進(jìn)程的所有線程的pid,現(xiàn)在我只想要主線程的pid。
作者: teclimber    時(shí)間: 2011-06-10 09:19
難道這樣一個(gè)問題都沒人回答上來?
作者: crazyhadoop    時(shí)間: 2011-06-10 10:13
回復(fù) 1# teclimber


    一個(gè)進(jìn)程不論多少線程,對(duì)外顯示都是同一個(gè)pid吧?  倒是有線程id鑒別不同的線程。
作者: teclimber    時(shí)間: 2011-06-10 10:46
回復(fù) 3# crazyhadoop


    不對(duì),pid是不同的,在linux中線程的本質(zhì)是進(jìn)程(輕量級(jí)進(jìn)程),他們是有不同的pid的。我現(xiàn)在的程序就有6個(gè)線程,在ps的時(shí)候每個(gè)線程都有一個(gè)pid的。我就是想找出主線程的pid
作者: crazyhadoop    時(shí)間: 2011-06-10 11:02
回復(fù) 4# teclimber


    咦~原來還真沒注意過~你說的是 LWP和NLWP 這貌似是偽pid  不過沒看到有多個(gè)線程啊,請(qǐng)問下這個(gè)步驟啊~~
作者: teclimber    時(shí)間: 2011-06-10 11:47
回復(fù) 5# crazyhadoop


    就是ps就會(huì)有了,我用pidof查看的時(shí)候會(huì)有幾個(gè)id.我就是想找出主線程的id,然后殺死主線程,其余線程也就殺死了,否則我就要每個(gè)都?xì)⑺酪淮巍?hr noshade size="2" width="100%" color="#808080"> 作者: crazyhadoop    時(shí)間: 2011-06-10 11:52
回復(fù) 6# teclimber


    啊,我試了么有啊~主線程等別的線程執(zhí)行完畢再結(jié)束不行嗎?   或者你能把程序貼出來瞧瞧嗎?
作者: teclimber    時(shí)間: 2011-06-10 12:29
回復(fù) 7# crazyhadoop


    不行,我就是要?dú)⑺肋@個(gè)進(jìn)程的。
作者: cokeboL    時(shí)間: 2011-06-10 13:52
主線程應(yīng)該就是進(jìn)程本身,就是進(jìn)程的pid,用getpid()就ok了,進(jìn)程或者線程當(dāng)中調(diào)用getpid()都返回該進(jìn)程的pid。

看上面的回復(fù)不太明白你要做什么,是在控制臺(tái)查看管理嗎?如果是控制臺(tái)查看的話,ps命令不顯示線程啊。。。只顯示出進(jìn)程。。。
或者如果你說的線程的意思是fork()出來的多個(gè)子進(jìn)程?如果是這樣,殺死父進(jìn)程并不代表把所有子進(jìn)程全殺掉啊。。。暈,樓主解釋清楚點(diǎn)哈。
作者: cokeboL    時(shí)間: 2011-06-10 13:54
回復(fù)  crazyhadoop


    不對(duì),pid是不同的,在linux中線程的本質(zhì)是進(jìn)程(輕量級(jí)進(jìn)程),他們是有不同 ...
teclimber 發(fā)表于 2011-06-10 10:46



    不同線程的ID是不同的,但是線程ID的類型是pthread_t,跟pid_t是不一樣的哈
作者: teclimber    時(shí)間: 2011-06-10 14:46
本帖最后由 teclimber 于 2011-06-10 14:51 編輯

回復(fù) 9# cokeboL


    getpid這個(gè)函數(shù)是獲得當(dāng)前進(jìn)程的pid。我現(xiàn)在要在另外一個(gè)進(jìn)程里獲得這個(gè)進(jìn)程的pid,并且通過kill殺死改進(jìn)程。說的有點(diǎn)亂。舉個(gè)例子吧!
有個(gè)進(jìn)程名字叫A,同時(shí)還有一個(gè)進(jìn)程的名字叫B,進(jìn)程B要獲得進(jìn)程A的pid并且要通過kill結(jié)束進(jìn)程A。

   當(dāng)然如果進(jìn)程A不是多線程的話,我可以用pidof來獲得進(jìn)程A的pid。但是現(xiàn)在我的程序是個(gè)多線程的程序,我用pidof的時(shí)候,會(huì)有好幾個(gè)id,當(dāng)然這幾個(gè)id逐個(gè)kill的話也是可以殺死進(jìn)程A的,但是我想只是通過結(jié)束該進(jìn)程的主線程,從而來結(jié)束進(jìn)程。這樣就不用逐個(gè)kill了。
所以,我現(xiàn)在不知道該如何獲得該多線程的主線程的id
作者: crazyhadoop    時(shí)間: 2011-06-10 15:36
回復(fù) 11# teclimber


    能貼帖代碼嗎?  越聽越亂呢
作者: cokeboL    時(shí)間: 2011-06-10 15:37
回復(fù)  cokeboL


    getpid這個(gè)函數(shù)是獲得當(dāng)前進(jìn)程的pid。我現(xiàn)在要在另外一個(gè)進(jìn)程里獲得這個(gè)進(jìn)程的pid ...
teclimber 發(fā)表于 2011-06-10 14:46



    為什么我用pidof a.out只返回一個(gè)進(jìn)程ID(多線程程序,線程均未退出)。。。
作者: cokeboL    時(shí)間: 2011-06-10 15:49
本帖最后由 cokeboL 于 2011-06-10 15:51 編輯

回復(fù) 11# teclimber
  1. /*  pthread.c  */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <pthread.h>

  6. void *func1(void* v)
  7. {
  8.         printf("pthread 1 parent pid: %d\n", getpid());
  9.         while(1);
  10. }

  11. void *func2(void* v)
  12. {
  13.         printf("pthread 2 parent pid: %d\n", getpid());
  14.         while(1);
  15. }

  16. int main()
  17. {
  18.         pthread_t tid_1, tid_2;
  19.         pthread_create(&tid_1, 0, func1, 0);
  20.         pthread_create(&tid_2, 0, func2, 0);
  21.         pthread_join(tid_1, 0);
  22.         pthread_join(tid_2, 0);
  23. }
復(fù)制代碼
  1. /*  kill_pro.c  */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>

  5. int main()
  6. {
  7.         char *p = "kill -9 `pidof a.out`";
  8.         system(p);
  9. }
復(fù)制代碼
  1. [cokeboL@localhost practice]$ cc pthread.c -lpthread
  2. [cokeboL@localhost practice]$ a.out
  3. pthread 1 parent pid: 21050
  4. pthread 2 parent pid: 21050  //執(zhí)行kill_pro前
  5. 已殺死  //執(zhí)行kill_pro后

  6. [cokeboL@localhost practicvoi&
復(fù)制代碼
  1. [cokeboL@localhost practice]$ cc kill_pro.c -o kill_pro
  2. [cokeboL@localhost practice]$ kill_pro
復(fù)制代碼

作者: teclimber    時(shí)間: 2011-06-10 17:02
回復(fù) 12# crazyhadoop


    代碼沒辦法貼,最少有幾萬行呢。
作者: teclimber    時(shí)間: 2011-06-10 17:15
回復(fù) 14# cokeboL


    你這個(gè)代碼我在linux虛擬機(jī)里試了,確實(shí)是只有一個(gè)pid.pidof a.out也只有一個(gè)pid.
但是當(dāng)我把他放到我的板子上運(yùn)行的時(shí)候,他就會(huì)有多個(gè)pid,pidof的時(shí)候會(huì)有四個(gè)id.我的板子是基于arm9的,跑linux。
還有一點(diǎn)就是很疑惑,三個(gè)線程怎么會(huì)有四個(gè)id呢?  我自己的程序也有這個(gè)情況,就是id的個(gè)數(shù)要比線程的個(gè)數(shù)多一個(gè)。
作者: cokeboL    時(shí)間: 2011-06-10 17:22
回復(fù)  cokeboL


    你這個(gè)代碼我在linux虛擬機(jī)里試了,確實(shí)是只有一個(gè)pid.pidof a.out也只有一個(gè)pid. ...
teclimber 發(fā)表于 2011-06-10 17:15



那可能是pidof的實(shí)現(xiàn)不同吧,主線程+創(chuàng)建的線程數(shù)?是在不行增加個(gè)自定義的系統(tǒng)調(diào)用,從內(nèi)核找到該名字的進(jìn)程pid然后殺掉吧,不過改內(nèi)核些東西,煩躁,我現(xiàn)在還沒太多時(shí)間學(xué)那個(gè),看wifi呢,樓主自己找點(diǎn)帖子改下吧,重編下內(nèi)核,或者寫個(gè)簡(jiǎn)單驅(qū)動(dòng)模塊加進(jìn)去也行。
作者: cokeboL    時(shí)間: 2011-06-10 17:25
暈,弄個(gè)進(jìn)程間通信,把pid傳過去也行啊
作者: crazyhadoop    時(shí)間: 2011-06-10 17:27
回復(fù) 16# teclimber


    你寫的不會(huì)是多進(jìn)程吧。哈哈
作者: cokeboL    時(shí)間: 2011-06-10 17:38
回復(fù)  teclimber


    你寫的不會(huì)是多進(jìn)程吧。哈哈
crazyhadoop 發(fā)表于 2011-06-10 17:27



樓主用的班子上跑的是哪版的內(nèi)核?2.4的?2.4的內(nèi)核線程的實(shí)現(xiàn)其實(shí)是靠進(jìn)程的偽實(shí)現(xiàn),就是樓主說的輕量級(jí)進(jìn)程(但2.6是真正意義上的線程,2.6內(nèi)核線程具體怎么實(shí)現(xiàn)、和進(jìn)程的區(qū)別我就不太懂了),有可能因此導(dǎo)致pidof會(huì)顯示出所有線程和主進(jìn)程的pid,或者pidof實(shí)現(xiàn)差異吧。
作者: teclimber    時(shí)間: 2011-06-10 18:48
回復(fù) 19# crazyhadoop


    絕對(duì)是多線程,這個(gè)是不用懷疑的
作者: teclimber    時(shí)間: 2011-06-10 18:50
回復(fù) 20# cokeboL


    是2.6.25的內(nèi)核,我以前沒遇到過。但是事實(shí)就在我面前。
作者: tdy218    時(shí)間: 2011-06-11 23:14
本帖最后由 tdy218 于 2011-06-12 10:04 編輯

不知道LZ想要的是不是下面命令輸出的效果.
下面拿RedHat Enterprise Linux 5.1(Linux kernel 2.6.18-53.e15,glibc 2.5)做下操作示例.
首先用ps –ef|grep java|grep –v grep命令獲取一個(gè)java進(jìn)程的pid,這里得到的javapid是2577,然后進(jìn)行下面的操作:
[root@tdy218 ~]# ps -Lp 2577  cu
USER   PID   LWP %CPU NLWP %MEM    VSZ   RSS TTY   STAT START   TIME COMMAND
root   2577  2577  0.0   52 24.2 863560 141148 ?    Sl   Oct18   0:09 java
root   2577  2578  0.0   52 24.2 863560 141148 ?    Sl   Oct18   0:00 java
root   2577  2579  0.0   52 24.2 863560 141148 ?    Sl   Oct18   0:00 java
………………………

Java虛擬機(jī)就是一個(gè)單進(jìn)程,多線程的軟件,看看我寫的這篇文章,不知道是不是LZ想要的。
http://www.tdy218.com/?p=48
作者: teclimber    時(shí)間: 2011-06-12 16:38
回復(fù) 23# tdy218


    我的那個(gè)好像還和你的情況不太一樣,你的pid都是一樣的,我的那個(gè)pid都是不一樣的。
作者: sw2wolf    時(shí)間: 2011-06-13 10:48
在`top`里, 打大寫的H鍵試試
作者: chinesedragon    時(shí)間: 2011-06-14 10:46
再換塊版子試試
作者: adidas_cn    時(shí)間: 2011-06-14 15:03
貌似好復(fù)雜的樣子。。。
作者: asdf2110    時(shí)間: 2011-06-14 16:02
ps -efL | grep 進(jìn)程名

-L 可以看到各個(gè)線程
作者: luyuan89    時(shí)間: 2011-12-15 10:42
直接調(diào)用getpid()獲取的就是主進(jìn)程的pid
作者: liubin6267    時(shí)間: 2011-12-17 22:36
回復(fù) 9# cokeboL


    線程模式有兩種:LinuxThreads和NPTL。比較老的Linux版本用的是LinuxThreads機(jī)制,現(xiàn)在新的內(nèi)核版本用的是NPTL;
LinuxThreads機(jī)制下線程就被當(dāng)做一個(gè)進(jìn)程,用getpid()獲取線程ID是可以的;
但是在NPTL機(jī)制下,一個(gè)進(jìn)程的所有線程只有一個(gè)進(jìn)程PID,獲取線程的ID用gettid()獲取,可能有的沒有該系統(tǒng)函數(shù),可以直接用系統(tǒng)調(diào)用代替,具體的系統(tǒng)調(diào)用ID可以到內(nèi)核中查看;
作者: liubin6267    時(shí)間: 2011-12-17 22:55
用戶創(chuàng)建線程時(shí),可以先用getpid()獲取當(dāng)前線程的進(jìn)程ID(pid),然后通過proc信息查看:/proc/pid/stat查看,是可以查看到線程信息的,當(dāng)然我說的用戶創(chuàng)建的線程,系統(tǒng)線程怎么查看就不是很清楚了
作者: djsxut    時(shí)間: 2011-12-18 09:57
我在ARM9260的開發(fā)板上倒是這種情況,每開一個(gè)線程ps會(huì)出現(xiàn)一個(gè)pid,應(yīng)該是選擇的線程模型不一樣。不過一般pid大的應(yīng)該就是主的pid。
作者: cobber622    時(shí)間: 2012-10-09 10:48
kill -9 {pid}
pid為ps看到的最小的那個(gè)
作者: _Rayx    時(shí)間: 2012-10-09 13:43
好像是的,linux的線程是用clone做的-_-跟MAC OS什么的不一樣。
作者: hejindan88    時(shí)間: 2012-10-09 17:27
pthread_t pthread_self(void),打印本線程id   不知對(duì)你有幫助沒
作者: hejindan88    時(shí)間: 2012-10-09 17:29
  一個(gè)進(jìn)程只有一個(gè)pid啊   線程id只在本進(jìn)程內(nèi)有效吧




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2