如何在Linux下从C程序/守护进程启动firefox

时间:2011-12-09 01:50:17

标签: linux bash firefox

从使用C语言编写的Linux守护程序启动firefox时遇到一些问题。 当我使用/usr/bin/firefox从命令shell在机器本身(通过终端)上启动firefox时,它工作正常,并且firefox浏览器窗口会按照它应该启动。

但是,如果我在使用system("/usr/bin/firefox")的C守护程序中尝试此操作,则firefox会在终端中启动其进程,但浏览器窗口未打开?

当我尝试使用远程终端访问时,会发生类似的事情。这是告诉系统在窗口模式下打开firefox而不是尝试在终端模式下打开它 - 但我不知道如何使用bash命令指定它?

我在Linux系统中使用Lubuntu 11.10 非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

Firefox需要知道它应该打开哪个显示器。当您在gui中运行它时,即使通过终端仿真器,DISPLAY环境变量也会设置为适当的值。从守护程序启动时,请尝试system("/usr/bin/firefox -display=:0")

答案 1 :(得分:1)

有一个原因我问你为什么要做你想做的事。我不想在评论中详细介绍。

Unix上的Firefox是一个X-Window进程(大多数Linux / Unix桌面都基于X11协议,这是X-Window的核心)。 X-Window的功能是将程序的显示与运行程序的进程分开。例如,我现在正在Linux工作箱中运行Firefox,但Linux机箱实际上是在Mac上显示Firefox浏览器窗口。

为了做到这一点,我不得不:

  • 在我的Mac上运行X11。 X11程序创建了一个名为0.0的默认X11客户端显示,它几乎说明了第一个屏幕和X11运行的第一个实例(计算机极客如从零开始计数)。该过程在我的Mac上运行。从某种意义上说,它实际上是一个服务器进程,而不是客户端,因为它正在端口6000上等待客户端 X11进程(Firefox)告诉它该做什么。 / LI>
  • 在我运行firefox之前,我必须告诉我的Mac X11进程我授权运行Firefox的X11服务器才能在我的X11客户端进程上显示。否则,你可以想象有人通过在显示器上不断弹出Windows来向另一个人发送垃圾邮件。您可以使用xhost程序执行此操作。
  • 为了在Linux机器上运行Firefox,我告诉Firefox进程我正在运行它的X11客户端。我可以通过将DISPLAY环境变量设置为“10.0.1.33:0.0”之类的方法来完成此操作。这意味着X11客户端正在IP地址10.0.1.33上运行该机器,我希望您在该屏幕上使用第一个屏幕和第一个X11客户端实例。
  • 现在,我可以在我的Linux机器上运行Firefox,显示屏将显示在我的Mac上。

您遇到的问题是,当您将FireFox作为守护程序进程启动时,根本就没有X11客户端。 X11客户端与用户和某种显示相关联。显示器可以是虚拟显示器,但必须有一个正在运行且可以某种方式寻址的X11客户端,因此该过程知道显示输出的位置。

顺便说一下,你说守护进程在Unix / Linux中具有非常非常特殊的含义。守护程序是一个在后台运行的进程,通常有一个与之关联的服务(和一个端口)。例如,有一个名为ftpd的FTP守护进程,邮件服务器使用sendmail守护进程,ssh有sshd守护进程。守护进程没有与之相关的显示。

但是,看起来您可能正在使用这个词来表示通过其他进程启动Firefox。真的吗?如果是这样,您将必须确保Firefox知道要使用的X11显示(有一个命令行设置用于指定显示),并且您的X11客户端(您的登录会话)已授予另一个进程更新的权限使用程序窗口显示。

您能否详细解释一下您要做的事情?如果您只想从远程http服务器下载文件(当然正在运行名为httpd的http守护程序进程),则应使用不需要的curlwget显示器,使用起来更简单。如果您正在尝试做其他事情,请让我们确切知道它是什么。

答案 2 :(得分:0)

确保在您的守护程序中正确设置了DISPLAY环境变量,以引用您希望firefox使用的X服务器。

如果守护程序作为与“拥有”您要使用的X服务器的用户帐户不同的用户帐户运行,则还需要使用xauth(1)配置身份验证令牌以授予权限使用X服务器。

通常情况下,使用ssh -X隧道X 一次性正确配置xauth(1)令牌比尝试管理xauth(1)令牌要容易得多你自己。也许将ssh -X添加到您的环境中是合适的,也许不是。 (我之前甚至在我需要以ssh -X root@localhost运行X客户端时使用root,并且不想打扰手动配置xauth(1)ssh(1)就是这样更容易。)