LINUX.ORG.RU

IPC в GLib


0

1

Всем привет!

Задумал реализовать открытие нескольких файлов в одной программе. Т.е. файловый менеджер запускает по экземпляру программы на каждый файл, а я хотел бы, чтобы все файлы в 1 экземпляре были.

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

В Glib есть g_io_channel_unix_new(). Как слушать канал, тоже нашел. Но я не нашел как проверить создан ли канал уже?

Спасибо всем, кто ответит. :)

★★★★★

См. как это сделано в GIMP

yoghurt ★★★★★
()

>Если сокета нет, создать и слушать

А если есть - его просто не дадут создать :) вот и ответ на вопрос

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

А... т.е. создается сокет, обычными функциями юникс (не гтк), а потом его ID передается в g_io_channel_unix_new ()?

hibou ★★★★★
() автор топика

Здесь есть проблема, что local domain socket (pipe) не удаляется системой при завершении процесса. Так что, если программа упадет, pipe останется и следующий запуск будет расценен как «не первый». Можно использовать network socket на localhost, но порты занимать - это не лучшая идея, как мне кажется.

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

А можно ли как-то проверить слушается ли сокет или уже нет?

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

>А... т.е. создается сокет, обычными функциями юникс (не гтк), а потом его ID передается в g_io_channel_unix_new ()?

Ога

GIOChannel* g_io_channel_unix_new (int fd);
yoghurt ★★★★★
()
Ответ на: комментарий от PayableOnDeath

unlink сразу после открытия.

anonymous
()

связка g_app_info_get_executable()/g_spawn_command_line_async() подойдет, если я правильно понял, о чем речь?

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

Нет, ты говоришь со стороны файлового менеджера. А я - со стороны запускаемой программы. Не файл-менеджер же переделывать?!

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

>>понял. libunique - ответ на твои вопросы

Или GtkApplication.

MuZHiK-2 ★★★★
()
Ответ на: комментарий от PayableOnDeath

>Здесь есть проблема, что local domain socket (pipe) не удаляется системой при завершении процесса.

Ты хочешь сказать, что можно установить полноценный коннект на unix сокет упавшего процесса?

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

>Так что, если программа упадет, pipe останется и следующий запуск будет расценен как «не первый».

Нет, но файл (а именно им представляется pipe) остается. Чтобы снова работать, надо удалять его.

Ну вот видишь. Значит можно использовать схему с unix socket. Правда надо как-то решить проблему с конкурентным доступом.

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

> А я - со стороны запускаемой программы

Если сокет никто не слушает, к нему и не дадут сделать connect(), IMHO :-)

no-dashi ★★★★★
()
Ответ на: комментарий от PayableOnDeath

> Здесь есть проблема, что local domain socket (pipe) не удаляется системой при завершении процесса.

Можно создать именованный пайп, открыть его на чтение, удалить пайп. ТОгда при завершении программы все удалится само

annoynimous ★★★★★
()
Ответ на: комментарий от no-dashi

Т.е. по сути логика такая:

Есои bind не прошло, то сокет уже есть и делаем connect, если connect не прошло, то unlink и снова bind. Так?

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

> Есои bind не прошло, то сокет уже есть и делаем connect, если connect не прошло, то unlink и снова bind. Так?

Между неудачным connect и unlink будет гонка.

const86 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.