如何欺骗应用程序运行不同的进程?

如何欺骗应用程序运行不同的进程?

我正在 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。

相关内容