2011-11-01 97 views
0

我在我的項目中看到一個奇怪的問題,儘管它存在於磁盤中,但perl無法看到文件。我們通過perl運行一系列短暫的後端作業(每個作業跨越10秒)。後端作業寫入輸出文件並退出,之後perl進程將嘗試傳輸它。作業最初運行良好,突然無法檢測到後端寫入的文件。調試perl代碼(來自http://www.cpan.org/src/的5.10.1),我發現stati64(win32.c中的win32_stat)失敗並返回-1。重試時,通話似乎正常。我可以保證沒有後端進程涉及的競爭條件,因爲我們試圖在後端退出後訪問perl中的文件。Windows中是stat還是stati64越野車?

有沒有人知道條件(當在短期工作中遞歸使用)下stat(或stati64)可以說文件不存在,雖然文件存在於Windows?它會緩存先前執行優化的結果嗎?

+0

嘗試關閉病毒掃描程序。 –

回答

1

如果您能夠重現該問題,請使用SysInternals Process Monitor(或已棄用但易於使用的Filemon)來查看正在發生的事情。

一個可能的原因是某些其他應用程序(例如防病毒程序或索引引擎)已鎖定該文件,但Procmon應顯示來自stat的錯誤代碼。

+0

感謝您的回覆。我嘗試了procmon並捕獲了文件活動的事件。這顯示文件的stat操作成功 - CreateFile,QueryInformationVolume,QueryAllInformationFile,CloseFile(for stati64)。但是調用的返回值是-1並且GetLastError()顯示6.在選中文件「test_31.01.dat」之前,我們檢查filemon顯示爲不成功的「test_31.01.dat.lock」的存在。這是可以的,因爲該文件不存在於代碼上下文中。沒有像病毒掃描程序這樣的外部代理,索引引擎在這裏中斷。有沒有優化問題? – Kartlee

+0

隨着procmon,你是過濾文件名(而不是過程名稱)?你想確保檢測到任何其他併發訪問。另外,問題的一致性如何?如果在什麼時候和哪個文件存在變化,那麼看起來更像是一種競爭條件而不是優化問題。 – jdigital

+0

是的,它基於文件名。在同一個文件中運行300次,我肯定會得到1-100之間的值。我懷疑自從procmon明確表明身份已經成功以來是否存在競爭狀況。我很驚訝爲什麼返回值只是-1而擴展錯誤爲6。 – Kartlee

0

如果你想知道你爲什麼會遇到錯誤,你應該檢查錯誤信息。它在$!中找到,也許更準確地在$^E中找到。

0

我最近在不同情況下遇到了一個非常類似的問題。當嘗試通過CGI訪問文件時,_stati64()將返回-1,並帶有ENOENT錯誤「無此文件或目錄」。我編寫了一個簡單的C程序在文件上運行_stati64(),以查看結果是否相同並且工作正常。

用Procmon進一步調查表明,通過CGI調用的進程在所涉及文件的父目錄上的CreateFile操作上會失敗;結果始終是ACCESS DENIED,這與嘗試訪問實際上不存在的文件的結果相同。

的修復結束了以下

  • 使得原本父目錄的副本,所有內容
  • 刪除原來的
  • 重命名拷貝到原來的名稱

是的,我不知道是什麼導致了這個問題,但調試起來卻是一個非常令人沮喪的問題。我的猜測是CGI訪問由於原始目錄中的僵化權限而失敗。