2012-05-11 42 views
9

我在我的代碼中使用fork。在我的代碼中調用fork之前,父進程聲明瞭一個全局變量。因此,在fork調用之後,子進程會在其自己的線程堆棧上獲取單獨的全局變量副本,或共享全局變量的現有父實例。所以我猜這裏有三種可能性 1)子進程獲取父進程中聲明的全局變量的單獨實例 2)子進程與父線程共享全局變量。 (這可能不是真實的) 3)子進程doesnt沒有任何關於父線程中的全局變量的信息尋求如何在perl中使用fork時在子進程和父進程之間共享變量

如果任何2或3選項是真的,我想知道是否有任何方式獲取全局變量及其在父進程中在子進程中聲明的「執行fork()時的狀態/值」。

如此廣泛,是否有任何訪問父進程變量的方式,並且存在使用fork()創建的子進程中的狀態。

回答

11

每個進程都有自己的內存空間。進程無法正常訪問另一個進程的內存。

fork的情況下,子進程的內存空間以父級的精確副本開始。這包括變量,代碼等。在一箇中更改這些變量中的任何一個都不會改變另一箇中的任何類似變量。

所以它的答案是#1。


即使你可以,你應該問的問題不是「我該如何分享變量?」但是「我如何交換數據?」。擁有一個受控通道不太容易出錯,因爲它提供了更寬鬆的耦合和更少的動作距離。

管道通常用於父母和孩子之間的溝通,但還有很多其他選擇。

0

這是情況「1)子進程獲取在父進程中聲明的全局變量的單獨實例」。

單獨進程的要點是分離內存。所以一旦分叉發生,你就不能在父進程和子進程之間共享變量。

您應該看看perlipc手冊頁,其中列出了進程間通信(IPC)的一些其他選項。並查看關於父子通信的其他StackOverflow問題。的代碼

1

實施例:

my $ipckey = IPC_PRIVATE; 
my $idshm = shmget($ipckey, 200, 0666) || die "\nCreation shared memory failed $! \n"; 

shmread($idshm, $xxx, 0, 1) || warn "\n\n shmread $! \n"; 

shmwrite($idshm, $xxx , 0, 1) || warn "\n\n shmwrite $! \n"; 
相關問題