2009-12-23 2 views
2

Есть ли способ «Posixy» открыть URL-адрес, предпочтительнее в браузере по умолчанию? Я хотел бы сделать что-то вродеPosixy способ запуска браузера?

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?

+0

Я беру его обратно о дубликате. Ссылки по теме: http://stackoverflow.com/questions/1949531/finding-the-preferred-application-for-a-given-file-extension-via-unix-shell-comma – dmckee

+0

Я бы не стал полагаться на поддержку Posix на MacOSX для таких вещей, потому что он может порвать с тем, что ожидают их пользователи. –

ответ

2

На Mac вы можете просто использовать команду open. open http://www.google.com от терминала открывает для меня новую вкладку Chrome. Просто заверните это в звонок system.

1

Одним из способов может быть переменная $ BROWSER. Xorg предоставляет xrdb, который является предпочтительным способом для этой среды, но я не предполагаю, что вы где-нибудь в Mac OS X.

2

Предпочтение браузера пользователя на самом деле не то, что касается стандарта POSIX, о котором я знаю.

1

Нет никакого переносного способа достижения этого. В Mac OS X решение будет состоять в том, чтобы использовать LSOpenCFURLRef или другой API LaunchServices, чтобы открыть URL-адрес с помощью обработчика по умолчанию для схемы URL. Другие платформы будут делать все по-другому.

3

В Linux вы должны попробовать запустить свой URL с помощью команды xdg-open. Если эта команда вызывается, более новые дистрибутивы должны запускать предпочтительный браузер пользователя. Он даже попытается запустить ссылки, если графический интерфейс отсутствует.

Очевидно, в POSIX ничего нет в отношении среды рабочего стола GUI. Для заполнения этой роли существуют такие проекты, как freedesktop.org. Он пытается определить некоторые базовые функции, которые будут работать во всех Unix-подобных десктопах, таких как GNOME и KDE.

Выполнение функции fork() и call() вместо exec() - это неопределенное поведение на POSIX, поэтому я не рекомендую это делать.

+0

Итак, system() определяется только для родительских процессов? Я не говорю, что вы ошибаетесь, но я не понимаю, почему, поскольку разветвленный процесс имеет собственное адресное пространство и все такое. Для меня это похоже на то, что вы не можете использовать printf() после разветвления. – SiegeX

+0

Не могу понять, почему system() является неопределенным поведением в POSIX после fork(), можете ли вы привести соответствующую часть стандарта POSIX? Благодарю. – Chris

+0

За вилкой() должен следовать exec(). В промежутке вы можете вызывать только функции с поддержкой асинхронного сигнала. Системе() не гарантированно безопасен асинхронный сигнал, также нет printf. – karunski

Смежные вопросы