如何欺騙應用程式運行不同的進程?

如何欺騙應用程式運行不同的進程?

我正在 wine 下運行 PDFXCview.exe (用於 pdfxchange 檢視器便攜式版本)來開啟 pdf 文件,透過

PDFXCview.exe 1.pdf

當我對另一個檔案執行相同操作時,另一個檔案將由 PDFXCview.exe 的相同進程開啟。我可以在不同的進程中打開它嗎?原因是當同一進程中開啟兩個 pdf 檔案時,應用程式會變慢甚至沒有回應。

是運行不同的進程還是不是由可執行檔 PDFXCview.exe 決定的?是因為exe檔作為伺服器運行嗎?

其他原生linux應用程式的解決方案是否相同?

謝謝。

答案1

原生地,可以使用相同的可執行程式碼運行多個進程。如果這不是自然發生的,那麼是的,程序本身就讓它發生了。但是,我無法告訴您這是如何在 Windows(或至少與 Windows 非常類似)系統上完成的。在Linux上,我們主要使用.pid檔案。

是因為exe檔作為伺服器運行嗎?

嗯,情況也可能如此。實際上 Emacs 中有一個選項可以實現這一點。然而,我不太明白 PDF 檢視器的意義…在 Linux 系統上,我可以想到兩種廣泛使用的解決方案:

  • 允許兩個實例進行通訊的 UNIX 套接字。
  • 訊號:當產生第二個實例時,它只會向第一個實例發送訊號(表示:醒來!)並退出。

您可能要檢查的第一件事:這是可設定的嗎?例如,在 VLC 上,可以這樣設定(這非常棒):

VLC選項

由於某種原因(我真的不想發現),我無法再運行 Wine 了。然而,在虛擬機器中,我在編輯 > 首選項菜單:

單一文件

多個實例

切換到單一文件並允許多個實例應該把這個小東西變成你正在尋找的 PDF 檢視器!

在 Linux 系統上,您可能可以嘗試使用.pid應用程式建立的檔案。這可能會導致令人討厭的結果,但如果您在應用程式啟動後刪除該文件,您應該能夠欺騙新實例,前提是它不會查找除該.pid文件之外的其他實例。

另一個解決方案是以另一個使用者身分執行第二個程序,因為兩個使用者不能共享相同進程,所以程式必須啟動兩次。這就是一些人在 Linux 上成功啟動 Skype 兩次的方法(儘管並不需要付出太多努力)。

您可能需要記住,在單一實例模式下運行的應用程式可能有充分的理由這樣做。而且,大多數時候,這是使用者的選擇,而不是實際必要的設計。

優點

  • 只有一個進程在運行,這意味著每個人都有一個記憶體位址空間,因此,可以輕鬆地在本來的進程之間進行通信兩個進程,兩個實例

  • 一些圖形程式運行得非常頻繁。以VLC為例:每次我開啟Music目錄中的MP3檔案時,它都會建立一個新視窗!也就是說,每隔 3 或 4 分鐘,當音樂結束時,我必須關閉舊窗口,然後打開新文件。那不太方便。完全沒有。然而,讓當前的 VLC 實例在其隊列中註冊下一首歌曲而不關閉/重新打開,這很簡潔。

  • 另一個優點:以超重型應用程式為例,例如一款精美的電玩遊戲。該應用程式需要花費大量時間和資源來啟動,而且我們都知道意外錯誤地啟動應用程式是多麼容易。透過將應用程式設定為在單一實例模式下運行,重新啟動它通常只會將第一個實例帶回前台。許多遊戲開發人員也利用這一點來防止用戶同時使用多個帳戶登入。

缺點

  • 好吧,正如您所看到的:設計不佳的趨勢。事實上,由於它使通信變得更加容易(不需要進程間通信,IPC),一些懶惰的開發人員可能會嘗試始終強制他們的應用程式進入單一實例狀態。對於大多數應用程式來說,這並不是一個真正的問題,但對於 PDF 檢視器來說,這太荒謬了。

  • 並不是真正的缺點,而是一個糟糕的情況:不提供此選項。除非你的申請真的需要在單一實例模式下運行,您應該始終將其作為使用者選擇(或在不干擾的情況下使用多實例)。

但最終,這裡主要關心的是使用者體驗。這就是為什麼單一實例模式通常是一個選項,因為它實際上取決於如何使用該程式。如果您每月僅觀看 1 或 2 個視訊文件,您可能不關心 VLC 在多個實例中運行。如果你 100% 的時間都在聽音樂,你確實會關心這一點,因為你不想最終nVLC 進程,具有n-1不活躍的。

答案2

一般來說,沒有。如果程式從不調用execve,則您沒有機會攔截任何內容,除非您設法編寫程式碼來預先載入符號,但我不確定這是否適用於 WINE。

相關內容