从使用C语言编写的Linux守护程序启动firefox时遇到一些问题。
当我使用/usr/bin/firefox
从命令shell在机器本身(通过终端)上启动firefox时,它工作正常,并且firefox浏览器窗口会按照它应该启动。
但是,如果我在使用system("/usr/bin/firefox")
的C守护程序中尝试此操作,则firefox会在终端中启动其进程,但浏览器窗口未打开?
当我尝试使用远程终端访问时,会发生类似的事情。这是告诉系统在窗口模式下打开firefox而不是尝试在终端模式下打开它 - 但我不知道如何使用bash命令指定它?
我在Linux系统中使用Lubuntu 11.10 非常感谢任何帮助。
答案 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浏览器窗口。
为了做到这一点,我不得不:
0.0
的默认X11客户端显示,它几乎说明了第一个屏幕和X11运行的第一个实例(计算机极客如从零开始计数)。该过程在我的Mac上运行。从某种意义上说,它实际上是一个服务器进程,而不是客户端,因为它正在端口6000上等待客户端 X11进程(Firefox)告诉它该做什么。 / LI>
xhost
程序执行此操作。您遇到的问题是,当您将FireFox作为守护程序进程启动时,根本就没有X11客户端。 X11客户端与用户和某种显示相关联。显示器可以是虚拟显示器,但必须有一个正在运行且可以某种方式寻址的X11客户端,因此该过程知道显示输出的位置。
顺便说一下,你说守护进程在Unix / Linux中具有非常非常特殊的含义。守护程序是一个在后台运行的进程,通常有一个与之关联的服务(和一个端口)。例如,有一个名为ftpd
的FTP守护进程,邮件服务器使用sendmail守护进程,ssh有sshd
守护进程。守护进程没有与之相关的显示。
但是,看起来您可能正在使用这个词来表示通过其他进程启动Firefox。真的吗?如果是这样,您将必须确保Firefox知道要使用的X11显示(有一个命令行设置用于指定显示),并且您的X11客户端(您的登录会话)已授予另一个进程更新的权限使用程序窗口显示。
您能否详细解释一下您要做的事情?如果您只想从远程http服务器下载文件(当然正在运行名为httpd
的http守护程序进程),则应使用不需要的curl
或wget
显示器,使用起来更简单。如果您正在尝试做其他事情,请让我们确切知道它是什么。
答案 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)
就是这样更容易。)