LINUX.ORG.RU

Системный вызов «проводника» в Linux

 ,


1

1

Мне нужно в своей программе дать юзеру возможность открыть заданную папку (например, с документацией) в его любимом файловом менеджере.

Таких в линуксе 146 штук:

  • Nautilus
  • Dolphin
  • Thunar
  • PCManFM
  • XFE
  • Konqueror
  • Krusader
  • DoubleCmd
  • Gnome-commander
  • Sunflower
  • Nemo
  • Marlin
  • Worker
  • 4Pane
  • emelFM2

Мне что, весь список перебирать командой

`which %cmd%`
пока не найду непустой возврат,
или всё-таки есть единый СИСТЕМНЫЙ ВЫЗОВ файлового менеджера установленного по умолчанию?

★★★★★

Последнее исправление: beastie (всего исправлений: 3)

Ответ на: комментарий от Novator

Отличительная особенность сисвызовов в переключении в ядро и для их выполнения совершенно не нужны библиотеки. Обосрался — обтекай, короче.

anonymous
()
Ответ на: комментарий от Novator

Библиотека может быть заглушкой/эмулятором. А если обращаешься в ядро - вот это я понимаю системный вызов :)

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от Novator

заголовок не понравился?

И заголовок, и текст. Они безграмотны.

Можешь более очевидный предложить?

Это называется «DE-независимый запуск». Просто «запуск».

intelfx ★★★★★
()
Ответ на: комментарий от anonymous

Опаньки, ещё один «теоретик» высрался. Тебе же 1й теоретик даже ссылку дал на википедию:

С точки зрения программиста, системный вызов обычно выглядит как вызов подпрограммы или функции из системной библиотеки.

Что Уважаемый Novator как программист практикующий и сказал - так что юные пафосные теоретики опять отсосали!

anonymous
()
Ответ на: комментарий от intelfx

Ты считаешь заголовок
«DE-независимый запуск «проводника» в Linux»
более понятный, чем
«Системный вызов «проводника» в Linux»
?

Если «да», то диагноз насчет тебя подтверждается.

Novator ★★★★★
() автор топика
Ответ на: комментарий от Novator

Понимаешь ли, существует общепринятая терминология. Согласно этой терминологии, в Linux не существует системного вызова, предназначенного для запуска «проводника», а само предположение об этом представляет собой ахинею.

Для любого грамотного человека твой вариант будет резать слух. То, что ты отказываешься следовать общепринятой терминологии, говорит лишь о твоей некомпетентности.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от Novator

Чтоб побольше кулхакеров набежало и меня научило же!

Царя забыл позвать.

ashot ★★★★
()
Ответ на: комментарий от anonymous

Тогда man 2 execve и расходимся по домам?

Deleted
()
Ответ на: комментарий от Novator

Господа, средний уровень программистов на раби.

Судя по отрывкам кода в треде, им еще и printf не завезли.

Deleted
()
Ответ на: комментарий от Deleted

Судя по отрывкам кода в треде, им еще и printf не завезли.

Таки printf есть, но вместо него чаще используют строковую интерполяцию.

theNamelessOne ★★★★★
()
Ответ на: комментарий от Novator

На венде есть os.startfile для такого

anonymous
()
Ответ на: комментарий от intelfx

ты отказываешься следовать общепринятой терминологии

Почему это отказываюсь? Системеный вызов - это обращение к системным библиотекам через системное API.

в Linux не существует системного вызова, предназначенного для запуска «проводника»

Ну дак и начхать. В винде «проводник» вызывают процедуры из системной библиотеки kernel32.dll. А вот в линуксе такой возможности нет, но зато есть костыль в виде xdg-open - что ж, тоже неплохо.

Я ведь заголовок такой написал, чтобы он был понятен любому при взгляде в «Уведомления» или «Трекер» за 1 секунду. И судя по реакции, Программисты меня поняли мгновенно. Практикующие программисты, понимаешь? Не пафосные юнцы-аналитики, а Практикующие Программисты.

Ну а то что я оскорбил эстетическое чувство пафосных юнцов-аналитиков - так это даже хорошо! Я очень рад! Вы должны страдать, потому что ни на что другое не способны.

Novator ★★★★★
() автор топика
Ответ на: комментарий от Novator

Системеный вызов - это обращение к системным библиотекам через системное API.

Даже если бы это было так, запуск гуёвого прикладного приложения сюда вообще не вписывается.

В ошибках нет ничего такого, а вот неспособность их признать это уже звоночек.

Deleted
()
Ответ на: комментарий от Deleted

Даже если бы это было так, запуск гуёвого прикладного приложения сюда вообще не вписывается.

Это так. В винде например.

В ошибках нет ничего такого, а вот неспособность их признать это уже звоночек.

И по таким как ты он уже прозвонил.

Novator ★★★★★
() автор топика
Ответ на: комментарий от Novator

В винде например

Системный вызов «проводника» в Linux

Понятно.

Deleted
()
Ответ на: комментарий от templarrr

Эффективным менеджером растёт.

anonymous
()

Уровень технических вопросов (да и ответов, отвечают-то те же, что и спрашивают) упал ниже плинтуса. На ответах мейл ру вопросы грамотнее

anonymous
()
Ответ на: комментарий от Novator

Лучше бы уж жопописаки вроде тебя были ни на что не способны, меньше вреда индустрии ПО было бы.

Например, не было бы раби.

Deleted
()
Ответ на: комментарий от Novator

В винде «проводник» вызывают процедуры из системной библиотеки kernel32.dll

Насколько я помню, всё же не kernel32, а в shell32.

А вот в линуксе такой возможности нет, но зато есть костыль в виде xdg-open

Это не костыль, это стандартное (на уровне десктопа) решение от freedesktop.org. Есть даже в МСВС, чем я в своё время был несколько шокирован.

Я это к тому, что уровень «стандартности» указанных решений в винде и линуксе можно считать примерно одинаковым.

hobbit ★★★★★
()
Ответ на: комментарий от Novator

Тебе всё правильно говорят, ты написал чушь в заголовке.

Можешь более очевидный предложить?

«Как вызвать „проводник“ в Linux?».

anonymous
()
Ответ на: комментарий от Deleted

меньше вреда индустрии ПО было бы.

От тебя прям столько пользы сообществу.

Например, не было бы раби.

Не осилил язык профессиональных программистов?
Ну так стыдись, а лучше учись, вместо кривляния на форумах.

Novator ★★★★★
() автор топика
Ответ на: комментарий от anonymous

«Как вызвать „проводник“ в Linux?».

Оно может и «правильней», но суть проблемы размывается: «откуда вызвать?» («он чо, ярлык не может найти на Рабочем столе?!»).

Вот мой заголовок точно говорит: «О, это программный вызов! Стандартный, заложенный в системе! Ясно, что чувак хочет!».

И ответы программистами были даны мгновенно.

А вот пафосных хипстеров практика программирования не интересует - они ходят на форумы покривляться друг перед другом.

Novator ★★★★★
() автор топика
Ответ на: комментарий от Novator

пафосных хипстеров

Цитата из бложика пациента:

По молодости я гнался за стереотипами, принятыми в толпе, вёлся на пропаганду, идущую с телевизора...

Рекомендую посмотреть бложик, давно так не ржал.

Deleted
()
Ответ на: комментарий от Novator

раби

язык профессиональных программистов

)

Deleted
()
Ответ на: комментарий от Deleted

По молодости я гнался за стереотипами, принятыми в толпе, вёлся на пропаганду, идущую с телевизора...

Рекомендую посмотреть бложик, давно так не ржал.

Текст не читал, но на всякий случай донёс в ФСБ, РКН и прокуратуру.

anonymous
()

язабан.

А вообще для вызова проводника в линуксе можно использовать wine explorer.exe

anonymous
()
Ответ на: комментарий от Novator

Ко-ко-ко, мы пафосные кривляющиеся анончики!
Мы правы, а ты, Novator - нет! Ко-ко-ко.

anonymous
()

... вызов «проводника» в Linux

А с какими тебе параметрами надо их вызывать? Надо ли передавать имя каталога для панели? А если панелей несколько, или он однопанельный? Что делать, если возникнет ошибка при запуске - как хочешь её обрабатывать (например, ошибка записи-чтения в/из конфига)? Какой канал взаимодействия с «родительской» программой предполагается? IPC?

Вариантов много, каждый fm запускается по-разному: https://en.wikipedia.org/wiki/Comparison_of_file_managers

Подумай, прежде чем проектировать свой программный комплекс!

pacify ★★★★★
()
Ответ на: комментарий от Novator

Оно может и «правильней», но суть проблемы размывается: «откуда вызвать?» («он чо, ярлык не может найти на Рабочем столе?!»).

Тогда

Как программно вызвать „проводник“ в Linux?
API для вызова „проводника“ в Linux?

О, это программный вызов! Стандартный, заложенный в системе! Ясно, что чувак хочет!

Нет. Чувак хочет, что бы ядро откуда то знало про конкретный файловый менеджер.

Системеный вызов - это обращение к системным библиотекам через системное API.

Нет.

deadskif
()
Ответ на: комментарий от l4gfcm

Оказалось, что в винде «start C:\User\Path» не открывает в проводнике папку. Пришлось снова костылять и получилась вот такая кроссплатформенная штука на Ruby (поддерживающая кириллицу в путях!), открывающая и папки, и url, и в винде, и в линуксе:

  CP_UTF8        = 65001
  $waMultiByteToWideChar = nil

  # Convert UTF8 to Unicode in Windows
  # RU: Конвертировать UTF8 в Юникод в Винде
  def self.win_utf8_to_unicode(str)
    if init_win32api
      $waMultiByteToWideChar ||= Win32API.new('kernel32', \
        'MultiByteToWideChar', ['I','L','S','I','P','I'], 'I')
      if $waMultiByteToWideChar
        str = str.dup
        str.force_encoding('UTF-8')
        len = $waMultiByteToWideChar.call(CP_UTF8, 0, str, -1, nil, 0)
        if (len.is_a? Integer) and (len>0)
          buf = 0.chr * len * 2
          len = $waMultiByteToWideChar.call(CP_UTF8, 0, str, -1, buf, len)
          str = buf if (len.is_a? Integer) and (len>0)
        end
      end
    end
    str
  end

  $waShellExecute = nil

  # Open in Windows
  # RU: Открыть в Винде
  def self.win_shell_execute(link, oper=nil)
    #oper = :edit, :find, :open, :print, :properties
    res = nil
    if init_win32api
      link = win_utf8_to_unicode(link)
      $waShellExecute ||= Win32API.new('shell32', 'ShellExecuteW', \
        ['L', 'P', 'P', 'P', 'P', 'L'], 'L')
      if $waShellExecute
        oper = win_utf8_to_unicode(oper.to_s) if oper
        puts 'win_shell_execute [link, oper]='+[link, oper].inspect
        res = $waShellExecute.call(0, oper, link, nil, nil, SW_SHOW)
        res = ((res.is_a? Numeric) and ((res == 33) or (res == 42)))
      end
    end
    res
  end

  # Open link in web browser, email client or file manager
  # RU: Открывает ссылку в браузере, почтовике или проводнике
  def self.external_open(link, oper=nil)
    if PandoraUtils.os_family=='windows'
      PandoraUtils.win_shell_execute(link, oper)
    else
      pid = Process.spawn('xdg-open', link)
      Process.detach(pid) if pid
    end
  end
Novator ★★★★★
() автор топика
Последнее исправление: Novator (всего исправлений: 3)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.