LINUX.ORG.RU

Процесс хочет сообщить о себе данные

 , ,


1

2

Привет. У меня есть процесс пусть tokenizer, который запускается независимо от меня и генерирует внутри себя токен, с которым дальше работает как ему надо. Внешний процесс хочет этот токен прочитать по PIDу tokenizer-a. Я могу менять код tokenizer-a, он на питоне. Конечно, можно нагородить IPC или писать временные файлы типа /tmp/tokenizer.PID, но по-моему и IPC и временные файлы для одной строки текста - это очень криво. Может ли tokenizer записать внутри себя этот токен таким образом, которую можно будет прочитать, например, через /proc/PID/?

Типа

# ???
magic(token)


# из внешнего шелла...
cat /proc/PID/magic
7b-4


Код Linux-only, о переносимости можно не заботиться.

Можно создавать сокет и отдавать токен через него.

MrClon ★★★★★ ()

Доступ то в /proc/pid/ будет? Можно закодировать в cmdline или переменные окружения (environ), но читать всё это можно либо под рутом, либо под пользователем процесса.

... и временные файлы для одной строки текста - это очень криво

Кривто это трахать мозги неочевидными костылями.

mashina ★★★★★ ()
Последнее исправление: mashina (всего исправлений: 1)

чем

$ cat /tmp/tokenizer.pid 7b-4

из внешнего шела, принципиально отличается от

/proc/... ?

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

Разве environ меняется автоматически, если я сделаю новую переменную окружения внутри процесса? Я могу сделать setenv() внутри процесса, но эта же переменная не будет видна в environ.

former_anonymous ★★★ ()

В argv[0] допиши свой токен, да и всё.

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

меняется если ты перезапишешь уже имеющееся env (третий параметр main()), но не более той длины, которая уже есть. То есть придётся пожертвовать какой-то переменной окружения и перезаписать её, даже не знаю.

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

Тогда через execve нужно менять, первый запуск считаем, выставляем в setenv и запускаем себя примерно как execve(argv[0], argv, environ).

mashina ★★★★★ ()

Сделай абстракцию:

Сделай так чтобы можно было запустить твой процесс примерно так:

tokenizer --client token get

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

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

придётся пожертвовать какой-то переменной

так а ты запускай либо с дополнительной опцией типа prog token=000..., либо с новой переменной token=000... prog. главное, чтобы количество нулей соответствовало длине токена.

ещё на стеке есть таблица elf auxiliary table и она тоже доступна в /proc/PID/axuv.

anonymous ()

Бери dbus и не парь мозги. Искать процесс по PID'у - это жесть какая-то.

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

удалять при следующем запуске, удалять в обработчике сигнала, не удалять (/tmp). нормальный человек бы сделал open().write().close() и поехал дальше, сразу видно кому делать нечего.

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

тссс, тут человек магии хочет, не понимая что за фасадом всегда скрывается рутина. это вроде как FOREACH(iter) ЛУЧЧЕ ПАТАМУШТА БЕЗ ЦИКЛА!

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

а есть смысл работы 2х копий программы ?
может както задачу пояснить, тогда и решение можно подобрать
я больше к сокетам склоняюсь

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

так а что в задаче не ясно? :) Есть внешний процесс, который хочет получить от работающих токенайзеров только одно - их сгенерированный токен. Я могу менять код токенайзеров, он на питоне.

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

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

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