Как открыть файл с помощью моей собственной программы и вызвать другую программу?

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

пример:
Так, например, все текстовые файлы с расширением .foo будут отображаться так, как если бы они открывались с расширением gedit. Но на самом деле происходит то, что они открываются одной из моих программ, а моя программа, в свою очередь, передает этот файл на gedit.

моя программа на С++ для этого выглядит так:

#include <string>
#include <cstdlib>

int main(int argc,  char** argv) {

    //open file with gedit
    system(("(gedit " + std::string(argv[1]) + " > /dev/null &)").c_str());

    //do other processing
    //...
}

Я считаю, что когда вы нажимаете на файл, и операционная система говорит, что его нужно открыть с помощью определенной программы, это имя файла передается программе на С++ в качестве второго аргумента этой программы (как индекс 1, поскольку нулевой индекс - это программа). название). & означает, что gedit запускается как фоновый процесс, а дополнительный () вокруг инструкции гарантирует, что gedit не будет закрыт при закрытии родительской оболочки.

проблема:
С учетом всего сказанного, эта программа работает правильно, когда у меня есть двоичный файл, находящийся в папке, которая указана в моей переменной $PATH, и я запускаю программу из командной строки, передавая файл, как если бы он был нажат. Однако это не работает, когда я на самом деле устанавливаю файл для открытия с помощью программы.

как я настроил запуск программы при щелчке по файлу:
я запустил скрипт, найденный в ответ на этот вопрос,
и программа ДЕЙСТВИТЕЛЬНО появляется, когда я Right Click->Properties->Open With введите здесь описание изображения
но ничего не происходит, когда я нажимаю на файл. Я даже поместил программу в бесконечный цикл и проверил, работает ли она как процесс, но это не так. Почему программа вообще не вызывается? Или он вызывается и просто сразу закрывается по какой-то причине? Разве этот скрипт не делает все, что мне нужно? Есть ли дополнительные шаги, которые мне нужно предпринять? Должен ли я попробовать зарегистрировать программу и связать ее с расширением файла по-другому?

Я на Убунте.


person Trevor Hickey    schedule 31.01.2014    source источник
comment
@Он отличается от системного пути. Это в какой-то локальной папке, которую я сам добавил в путь. Должен ли он быть в /usr/bin? О, знаете что, я просто использовал имя программы вместо полного пути. Я постараюсь использовать полный путь и обновить свой ответ, работает это или нет.   -  person Trevor Hickey    schedule 31.01.2014
comment
Куда вы положили test_program? Где-то на вашем пути может быть недостаточно, если ваш путь отличается от системного пути. Вы можете добавить код, который создает файл в /tmp, чтобы окончательно проверить, вызывается ли ваша программа.   -  person user4815162342    schedule 31.01.2014
comment
Ваш PATH обычно модифицируется в оболочке и влияет только на оболочку и программы, запущенные из нее. Окружение рабочего стола, с другой стороны, запускается раньше оболочки, поэтому изменения PATH из оболочки не влияют на нее. Система, скорее всего, не может найти вашу программу. Стандартное системное место для установки мелких несистемных программ — /usr/local/bin.   -  person user4815162342    schedule 31.01.2014


Ответы (1)


Вы можете просто открыть терминал и исследовать окружающую среду:

int main(int argc,  char** argv) {
    std::system("gnome-terminal");
}
person Community    schedule 31.01.2014