LINUX.ORG.RU

sleep, файлы или как передавать данные из php в c++ бинарник

 , , ,


0

3

Доброе времени суток
как бы вы решали задачу
максимально просто передать текст «123»
из php на локалхосте в с++ бинарник на локалхосте
пробовал через http, но оно не стабильно работает
решил навелосипедить через файлы, родил такой код
он ждёт пока php создаст входной файл, затем он читает из него строку и удаляет файл и снова ждёт

оно конечно работает, но эти слипы сьедают cpu на переключениях контекста если этот код запускать многоразово....

как вы сделали вечный забор строк из файла без слипов?
или какой способ передачи «123» из php в с++ бинарник выбрали бы вы?

while (true) {

ifstream number_file("number_file");

if (!number_file){
std::this_thread::sleep_for(std::chrono::milliseconds(10));
number_file.close();
continue; }

getline(number_file, number);

if ((number.empty()) {
std::this_thread::sleep_for(std::chrono::milliseconds(10));
continue; }  


////////////some actions
std::remove("number_file");
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}

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

А что сложного то? IPC aka Inter Process Communication довольно обыденная штука, к томуже судя по формулировке топика, метод уже есть, но он не нравится, pipe’ы самое оно, один процесс пишет в дескриптор, второй читает, сложное это шареные блоки памяти с правами доступа, а остальное вполне банальщина

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

через IPC можно сделать без слипов?

там есть встроеные блокировки?

мне не нужна замена ifstream number_file(«number_file»);

оно вполне себе работает и не жужжит

меня беспокоят слипы

т.к. это костыль и вызывает тормоза

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

слип это чисто твоя придурь. мамонты selectили, диды epollили, смузихлебы uvlibят и все счастливы. не нравятся сокеты забабахай что-то другое. пайп, да элементарный mkfifo пойдет.

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

Можно, в linux почти всё IO сводится к системным вызовам read и write, а с каким именно сокетом (AF_INET, AF_UNIX…) ассоциирован дескриптор и будет ли он блокирующим, это уже по вкусу

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

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

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

зато это просто с точки зрения реализации

в php

$log = fopen("/file", "w+");
              fwrite($log, $message);
              fclose($log);
}


всё остальное намного сложнее и не безотказнее этого

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

Первый попавшийся снипет со stackoverflow выглядит вполне простым и решающим все сложности

<?php
$socket = socket_create(AF_UNIX, SOCK_DGRAM, 0);
socket_sendto($socket, "Hello World!", 12, 0, "/tmp/myserver.sock", 0);
echo "sent\n";
?>
sparks ★★★★
()
Ответ на: комментарий от sparks

есть c++ 10000 бинарей
есть php код
мне нужно из php как-то распихивать данные в с++ бинари
желательно чтобы это 10000 бинарей не делали
sleep
каждые 10 мсек в ожидании входных данных

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

У тебя машина с 10000 ядер? Зачем тебе 10000 процессов?

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

В php пишешь в эти файлы. Просто пишешь.

При отсутствии данных принимающий процесс будет сам спать, без твоей помощи.

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

Если не вникать что наверняка присутствует пара сервисов, где один написан на с++ и один на php и надо организовать общение между ними, а сфокусироваться на 1000 файлах, то в c++ берём inotify и если известны все имена файлов, то вешаем ожидание события на все из них IN_CLOSE_WRITE, дальше select который будет ждать пока в один из файликов которые мониторятся придёт событие, если имена файлики появляются походу, то вешаем событие и на директорию и проверяем свеже созданные файлы

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

Это поведение по умолчанию хоть сишных fopen/fread, хоть сплюплюсного std::fstream.

Но читать надо именно файл созданный mkfifo. Обычный файл будет читаться до упора, а после EOF мгновенно возвращаться 0 байт. А вот fifo хитрее, туда можно подкидывать данные, а читатель будет блокироваться в их ожидании.

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

в с++ по умолчанию все из fstream и так блокирующее

судя по
«Обычный файл будет читаться до упора, а после EOF мгновенно возвращаться 0 байт»

в моём случае с того что там что-то по умолчанию блокирующее профита нет

мне нужно пробовать сделать файлы через mkfifo
потом писать в них с php
потом читать их в с++
и надеяться что оно сработает правильно

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

из php на локалхосте в с++ бинарник на локалхосте

это называется не из php в c++, а из изолированного окружения куда-то там. Вы же именно это имеете в виду, php внутри вебь-сервера.

Штатные базы sql/redis/etc или отдельный rest/websocket-rpc

PS/ если уж прибило мониторить файлы то inotify..но через файлы дико криво

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

Что за бредятину ты придумал? 10000 чего-то там (ещё стоит выяснить что конкретно скрывается за словами «10000 бинарей») это уже чистый идиотизм и никакие дальнейшие способы что-то им сообщать ситуацию не исправят.

И ещё

распихивать данные в с++ бинари

вот эта фраза - тоже полнейшая чушь. «Бинарь» это файл с машинным кодом. Если ты в него «распихаешь» данные, то машинного кода в нём уже не будет и он перестанет работать по назначению. И с++ тут ни при чём. Например, если ты хочешь «распихать» в бинарь /bin/sh строку 123, то это делается так:

echo 123 > /bin/sh

(от рута) но осторожно, после этого у тебя сломается шелл и придётся чинить систему.

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

есть c++ 10000 бинарей

Если они все запущены на одной машине то это плохо. Очень. Это очень большая нагрузка на ОС. Если речь про какой-то набор устройств и эти «бинари» на самом деле работают по сети - вопрос в способах коммуникации: как именно оно общается с сервером на php.

Если вариант «как обычно» и бинари просто шлют запрос на центральный сервер - ну сделай стандартную связку через базу, благо 10к клиентов не так много пока они не дергают сервер каждую секунду.

alex0x08 ★★★
()