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方式启动浏览器?的主要内容,如果未能解决你的问题,请参考以下文章
使用selenium时,使用从系统启动浏览器与通过自动化驱动方式启动浏览器控件ID不一样解决方法