LINUX.ORG.RU

Передача команд в процесс

 ,


1

2

Добрый день. Подскажите, пожалуйста, каким образом осуществляется управление программой без GUI, которая запущена в фоновом режиме. То есть, есть только ее PID. Как правильно организовать взаимодействие с такой программой? Например, программа в цикле бесконечно возводит 2 в квадрат. Как можно сообщить ей, чтобы она начала возводить какое-то другое число в какую-то другую степень? Я совсем новичек в C/C++. Сначала подумал, что можно использовать файл, который будет читать программа, и в который межно будет вводить какие-то команды, но крайне желательно обойтись без использования операций чтения/записи на HDD. Наверное, есть какое-то простое, стандартное решение, но мне никак не удается его найти. Спасибо.

Сокеты для развесистых команд.
Сигналы если команды без параметров и их мало.

MimisGotAPlan
()

То что ты хочешь называется Interprocess Communication. От языка не зависит. Способов - много.

Например один из самых простых и топорных вариантов - через файл. Программа читает число из этого файла, другая его туда записывает.

Есть еще куча вариантов.

invy ★★★★★
()

Читай Стивенса по UNIX IPC.

Вариантов уйма: сигналы, фифо, сокеты, объекты в разделяемой памяти, реальные mmap'нутые файлы и т.д., и т.п.

anonymous
()

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

generale
() автор топика

можно в одном потоке читать stdin и останавливать/запускать второй поток, в котором выполнять цикл. чтобы послать данные, достаточно их просто записать в /proc/PID/fd/0, например echo '3^4' > /proc/555/fd/0.

anonymous
()

SysV очереди уже советовали?

Очень простой способ для IPC, если софт бегает на никсах.

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

достаточно их просто записать в /proc/PID/fd/0

Трудно найти что-то более системо-зависимое, чем это :)

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

http://man7.org/linux/man-pages/man7/fifo.7.html

Первая же строка:

fifo - first-in first-out special file, named pipe

То, что это специальный именованный пайп, уже дело второе. В первую очередь, это тип очереди (уж простите меня за тавтологию) - порядок входа и порядок выхода.

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

Ты-то дальше первой строки осиль почитать. Так сложилось, что оно называется fifo, и для его создания есть команда mkfifo, а какой-нибудь mklifo нет.

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

Ты-то дальше первой строки осиль почитать.

Читайте по губам, fifo - это порядок входа и выхода из очереди.

Так сложилось, что оно называется fifo,

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

и для его создания есть команда mkfifo, а какой-нибудь mklifo нет.

Наверное разработчики команды релиши, что очередь lifo в данном случае ненужна, как и очередь filo, как и прочие очереди.

Но, повторюсь, это вообще никак не влияет на расшифровку аббревиатуры fifo.

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

Ты просто не знал что fifo в линуксе это ещё и тип специального файла, а теперь просто пытаешься неубедительно выкрутитьcя.

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

Так сложилось только в вашей голове,

Еще в моей и доброй дюжины знакомых мне людей. Когда речь идёт об Unix'ом IPC, аббревиатурой «fifo» называют «именованный пайп». Звучит как-то менее дебильно.

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

Ты просто не знал что fifo в линуксе это ещё и тип специального файла, а теперь просто пытаешься неубедительно выкрутитьcя.

Нет, пайп - это специальный файл, с очередью fifo. Просто вы не знали, что на самом деле означает fifo.

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

Еще в моей и доброй дюжины знакомых мне людей.

Это печально, что вы и добрая дюжина знакомых вам людей не знают, что такое fifo.

Когда речь идёт об Unix'ом IPC,

Я отвечал на Передача команд в процесс (комментарий) , а там ни слова об ipc.

аббревиатурой «fifo» называют «именованный пайп».

Pipe четко отражает очередь first in / first out, но не каждая очередь fifo обязана быть пайпом.

Звучит как-то менее дебильно.

Что fifo, что pipe звучат одинаково.

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

там ни слова об ipc

ОП хочет ipc, именно их ему и советуют. Нужно быть отбитым аутистом, чтобы не мочь в контекст.

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

Пайп это буфер в ядре.

А по вашему файл - это исключительно то, что лежит на диске?

Долго ещё собираешься забавлять публику своей неграмотностью? )

Вы уже выучили что такое fifo?

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

ОП хочет ipc, именно их ему и советуют.

Что хочет ТС, он изложил в своем стартовом сообщении.

Нужно быть отбитым аутистом, чтобы не мочь в контекст.

В сообщении, ссылку на который я дал, контекст отсутствует.

p.s. Используя слово «аутист» нужно понимать его значение.

andreyu ★★★★★
()

Тренд - это сокеты. Но остальные варианты тоже будут работать

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

Дислектик, я привёл оттуда прямую цитату, противоречащую тебе.

Фраза противоречит мне? Давно вы упоротым ходите на ЛОР? ;)

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

Мхех, чурка-регистрант не может в русский язык, кроме того что неосил свой же тупой троллинг, и переводит тему )

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

Мхех, чурка-регистрант не может в русский язык, кроме того что неосил свой же тупой троллинг, и переводит тему )

Да нет же, это ты тупой и не врубаешься, что FIFO переводится как first in / first out, как справедливо заметил andreyu. А есть ещё тип очереди last in / first out - так называемый «стек» - но такой тип межпроцессного взаимодействия поддерживается только в свободных ОС.

anonymous
()

UNIX Domain Sockets — позволят полноценно общаться с программой. Сетевые (BSD) сокеты можно использовать, если хочется отдавать команды по (не удивительно) сети. Первым же хватит файла в VFS.

Именованный канал (named pipe, fifo) — позволит передать в программу большой поток данных/команд, но с ними работать может быть чуть сложнее (незначительно).

Сигналы (signals) — подойдут для отправки ограниченного количества команд ограниченного количества типов. Сигналов не так много, с ними нельзя передать никакого сообщения и нет особо-то никаких гарантий, что они дойдут. Зато самый простой вариант, но придётся разобраться с sigaction.

SystemV Shared Memory, Message Queue — более хардкорные варианты. Если первые типы сообщений можно организовать прямо из shell средствами стандартных утилит почти любой unix-like системы, тут всё несколько сложнее. Я с ходу не могу назвать утилиты для отправки сообщения в выбранную очередь, к примеру. Но если «общаться» с твоей программой надо из кода другой программы — вполне приемлемый вариант, не сложный в реализации.

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

Да, на тему SysV Message Queue: её преимущество перед сигналами в принципе работы. Сообщения не прерывают программу, а могут забираться когда захочется. При этом они могут содержать в себе тип сообщения и даже некий набор байт в довесок («текст» сообщения).

Ну и вариант с маппингом (mmap) файла в память двум процессам никто не отменял, хотя при наличии предыдущих вариантов я бы не стал так делать.

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

SysV IPC пора пора забыть как страшный сон. Только POSIX.

SysV IPC есть везде и работает. Для задач уровня ТСа его хватит точно.

По поводу POSIX IPC сказать нечего, работал только с семафорами и многопоточностью (pthread, mutexes, rwlocks, condvars). Семафоры тоже только в ключе многопоточности использовал.

Было бы интересно прочитать подробное сравнение POSIX IPC vs SysV IPC.

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