2009-11-10 24 views
0

我有一個Perl腳本運行,就像一個服務,我用它做的事情之一就是用它來產生其他進程。其中一些進程是可執行文件,一些是perl腳本。Win32:Process SetProcessAffinityMask崩潰我的Perl

有時我想在某些這些進程上設置處理器親和力。我使用SetProcessAffinityMask來執行此操作,對於可執行文件,所有內容都按預期工作。對於perl腳本,這樣做會導致我的Perl服務崩潰。我運行的是activestate perl 5.8.8,我做了一些Google搜索,發現one other thread提到了一個類似的問題,就我所看到的而言,該線程的共識似乎與Perl編譯的方式有關。 任何想法或建議嗎?


我已經指出了這個問題,直到我正在運行的實際Perl。看來ActiveState Perl 5.8.8在SetProcessAffinityMask()方面存在問題。我卸載了5.8.8並安裝了5.10.1,使用了相同的確切代碼,並且按預期工作。


我使用Win32 ::流程:創建和利用的Win32 ::過程:setAffinityMask

+0

你有任何機會鏈接到我們這些線程? Offhand我會說,答案是「重新安裝或重新編譯Perl」.. :) – Ether

+0

你如何在Perl中產生新的進程?你使用'fork()'還是使用'Win32 :: Process :: Create'之類的東西? – mob

+0

(我已合併帳戶並編輯後續問題;您應該再次成爲問題所有者) –

回答

0

sample code(這是別人的代碼,對不對?)是廢話 - 通過硬編碼進程ID到Win32::Process::Open幾乎肯定會失敗。你如何使用Win32::Process的方法?

也爲Win32::Process筆記文檔:

 
    $ProcessObj->SetProcessAffinityMask($processAffinityMask) 
     Set the process affinity mask. Only available on Windows NT. 

但是這可能只是意味着文件已經過時。

use strict; 
use Win32::Process; 
use Win32; 
my $obj; 
my $pid=2216; 
my $iflags; 
Win32::Process::Open($obj,$pid,$iflags) or die; 
my $processAffinityMask; 
my $systemAffinityMask; 
$obj->GetProcessAffinityMask($processAffinityMask, $systemAffinityMask) or die; 
$obj->SetProcessAffinityMask($processAffinityMask) or die;