Posixy方式启动浏览器?

Posted

技术标签:

【中文标题】Posixy方式启动浏览器?【英文标题】:Posixy way to launch browser? 【发布时间】:2009-12-23 00:50:15 【问题描述】:

是否有一种“Posixy”方式来打开 URL,最好是在默认浏览器中?我想做类似的事情

ShellExecute(0, _T("open"), url, 0, 0, SW_SHOWDEFAULT);

适用于 GNU/Linux 和 MAC。我读了一些答案说`

if (fork() == 0)
    system("sensible-browser http://wherever.com");

至少在 Debian 系统上可以做到这一点。有没有一种简单的方法可以将其扩展到适用于其他发行版 Mac OS X 的东西?

【问题讨论】:

我收回关于重复的问题。相关链接:***.com/questions/1949531/… 我不会依赖 MacOSX 上的 Posix 支持来处理这些事情,因为它可能会与用户的期望发生冲突。 【参考方案1】:

在 Linux 上,您应该尝试使用 xdg-open 命令启动您的 URL。调用该命令时,较新的发行版应启动用户的首选浏览器。如果没有 GUI 运行,它甚至会尝试启动链接。

显然,POSIX 中没有关于 GUI 桌面环境的内容。像 freedesktop.org 这样的项目可以填补这个角色。它试图定义一些适用于所有类 Unix 桌面(例如 GNOME 和 KDE)的基本功能。

执行 fork() 和调用 system(),而不是 exec() 在 POSIX 上是未定义的行为,所以我不建议这样做。

【讨论】:

所以 system() 只为父进程定义?我没有说你错了,但我不明白为什么,因为分叉的进程有自己的地址空间等等。对我来说,这就像说你在 fork 之后不能使用 printf()。 我看不出为什么 system() 在 fork() 之后在 POSIX 上是未定义的行为,你能引用 POSIX 标准的相关部分吗?谢谢。 Fork() 后面必须跟 exec()。在这两者之间,您只能调用异步信号安全函数。 System() 不保证异步信号安全,printf 也不保证。 在分叉后调用 system() 没有意义。您可以执行 fork、exec,然后执行 system(),但这是多余的。 来自 fork() 手册:“当程序员编写多线程程序时,第一次描述使用 fork(),在同一程序中创建新线程,由 pthread_create( ) 函数。因此,fork() 函数仅用于运行新程序,在调用 fork() 和调用 exec 函数之间调用需要某些资源的函数的效果是未定义的。"【参考方案2】:

在 Mac 上,您可以只使用 open 命令。来自终端的open http://www.google.com 为我打开了一个新的 Chrome 选项卡。只需在system 电话中结束即可。

【讨论】:

【参考方案3】:

我所知道的 POSIX 标准本身并不真正关心用户的浏览器偏好。

【讨论】:

【参考方案4】:

一种方法可能是 $BROWSER 变量。 Xorg 提供了xrdb,这是该环境的首选方式,但我认为这不会让您在 Mac OS X 上获得任何帮助。

【讨论】:

【参考方案5】:

没有可移植的方式来实现这一点。在 Mac OS X 上,解决方案是使用LSOpenCFURLRef 或其他 LaunchServices API 使用 URL 方案的默认处理程序打开 URL。其他平台的做法会有所不同。

【讨论】:

以上是关于Posixy方式启动浏览器?的主要内容,如果未能解决你的问题,请参考以下文章

QTP--启动IE浏览器的三种方式

使用selenium时,使用从系统启动浏览器与通过自动化驱动方式启动浏览器控件ID不一样解决方法

浏览器主页被篡改修改回来的集中方式(不全)

另一种使用SAP SAT事务码对通过浏览器启动的应用的性能测量和分析方式

Hive启动的三种方式 —悟空智慧教育

h5启动原生APP总结