2012-02-02 227 views
0

我有一個問題其實我沒有理解關於子進程和父進程的一些信息。當我在子進程中更改全局變量時,這些更改不會影響父進程。我在這個網站上看到了一句話。它說:「修改父項或子項中的任何變量都不會看到對另一項的更改。」你能否提供更多信息?謝謝。全局變量,子進程和父進程

+0

順便說一下,我讀了另一條評論。它說,子進程和父進程在內存中有不同的空間,這就是爲什麼變更不起作用。我不知道這是否屬實。 – 2012-02-02 01:34:00

+1

進程不共享相同的虛擬內存地址空間,因此它們不能訪問彼此的變量。 – onit 2012-02-02 01:34:02

回答

4

我認爲你會對進程線程之間的差異感到困惑。

A 過程可以包含多個線程。一個進程有自己的地址空間和系統變量(比如文件句柄)。進程只能通過IPC機制進行交互,否則不能直接觸及其他進程變量。每個進程都有一個操作系統用來識別它的PID(至少在Linux中)。進程可以有許多線程在進程之上運行。

A 線程是一個獨特的結構,可以在一個進程內運行。每個線程都有自己獨特的堆棧指針(指向程序集執行)和唯一的註冊表值。當OS在線程之間切換時,它切換當前的執行行並恢復與該線程一起存儲的所有分區值。但是,進程中的線程共享所有相同的內存,這就是爲什麼您可以修改線程之間的全局變量和類變量並且它們受到影響。

如果有人想要在他們的鐘聲可以。這只是我認爲理解進程和線程之間差異的一些重要點的簡短總結。

+0

我明白你在說什麼。所以我可以有1個進程,但在裏面,可以有多個線程,他們共享相同的內存空間,這就是爲什麼變化會影響所有內存。好,我知道了。謝謝! – 2012-02-02 01:54:56

+0

@AhmetTanakol如果他們對你有幫助,你應該接受答案。我注意到你沒有接受你提出的任何問題。 – onit 2012-02-02 01:55:58

2

調用fork()之後,會創建父級的確切副本(好吧,不是真的,請參閱聯機幫助頁以瞭解詳細信息)因此,子級和父級都有不同的地址空間。因此,聲明modifying any variables in the parent or child will not see the changes also being made to the other one.

請閱讀manpage of fork()的確切細節。