2012-03-06 41 views
6

我正在實現一個在用戶空間中調用的系統調用,可以用foo來說。 系統調用訪問foo的task_struct(通過全局指針當前),打印它的名稱和pid,然後繼續到foo的父進程,foo的父進程父進程等。打印所有名稱和pid直到init進程。Linux中的進程id是否爲負數?

pid = 1保留給init,pid = 0保留給swapper。

根據swapper的task_struct,它的父進程本身。

Swapper(或sched)總是有pid = 0並始終是init的父進程?

是否所有pid都是非負數?我可以做出這樣的假設嗎?

回答

1

它始終爲正或0.內核源定義它爲pid_t類型,其中,afaik被認爲是無符號的(儘管它被定義爲能夠進行調用,以便能夠撥打電話,如fork返回負值數字在發生錯誤的情況下)。

+0

謝謝我會立即檢查pid_t是如何定義的。 – Plazo 2012-03-06 13:09:25

+1

我認爲它是簽名的,'fork'返回'pid_t',它可以是'-1'。我想我還記得在一些標題中看到它。需要檢查。 OFc,這並不意味着進程ID可以是負數 – 2012-03-06 13:12:46

+0

它已簽名,只是看着它。但它是如此以便返回錯誤:D – 2012-03-06 13:18:23

0

是的,他們實際上總是積極的。

您可以通過幾個POSIX系統調用(如等待)來驗證此情況,這些調用使用負值來表示諸如您自己的所有子進程等事物,並且只有正值代表有效的PID。

例子:http://linux.die.net/man/2/wait

4

爲了更簡明地回答你的問題:

  • IBM的Inside the Linux boot process介紹了交換技術工藝具有0的PID值,在啓動這個進程中運行/sbin/init(或其他進程過程作爲參數由引導加載程序給出),其通常將是具有PID 1的過程。
  • 在Unix系統中,PID值被分配sequentially,從第一個過程開始並且一直到最大值指定由/proc/sys/kernel/pid_max ied。因此,您可以放心地假設所有有效的PID都具有正值,而負值歸結爲誤差值等。
  • 一個好主意也可以解釋爲zombie進程,因爲如果它們被初始化所採用,它們可以在進程樹中獲得「特殊待遇」。
相關問題