Я строй полностью однопоточный C ++ менеджера бумажника, который использует сигналы C. Тем не менее, мне также нужно использовать Bitcoin в RPC-неблокируемой способом, поэтому я придумал умный способ использовать POPEN с амперсанд & в конце командной строки системы, где я называю завиток, чтобы сделать RPC для меня. POPEN команда в конце концов трубы в ответ RPC обратно на мой кошелек менеджер по NetCat / TCP. Проблема заключается в том, что signrawtransaction иногда может принимать аргумент, который больше, чем ARG_MAX в Linux (максимальная команда длины линии). Так POPEN потерпит неудачу, если я обеспечиваю необработанный гекс транзакции в качестве аргумента POPEN. Какие есть варианты, чтобы преодолеть это ограничение, и до сих пор мой менеджер бумажника однопоточный и сигнализировать безопасно?
Я исследовал использование анонимных труб, так что перед POPEN (режим записи) я бы назвал вилку и отправить необработанный гекс транзакций POPEN над его STDIN вместо командной строки. Тем не менее, концептуально вилы бы моя программа многопоточный, так что я не люблю его. Кроме того, дочерний процесс будет inhert обработчиков сигналов и, вероятно, получить SIGALRM действительно часто, потому что мой основной процесс получает его 8 раз в секунду. Итак, каковы мои варианты здесь? Я мог бы использовать подключение и обработать мой собственный запрос HTTP для RPC Bitcoin Кошелька, но я не хочу, чтобы заблокировать мою программу до тех пор, пока подключений заканчиваются, и я не хочу, чтобы реализовать протокол HTTP связанных вещи в моем коде.
Единственный вариант, который я считаю наиболее подходящим в моей ситуации является использование именованных каналов (makefifo). Создать именованный канал в папке TMP со случайным именем, а затем вызвать POPEN, который берет свой с этой стандартным вводом именем трубы, то я пишу сырой гекс транзакции в трубу и продолжать с моей основной программой немедленно. POPEN команда имеет амперсанд & в конце концов, так что это не делает мою основное зависания программы. Есть ли что-нибудь ужасно неправильно с таким архитектурным выбором? Есть что-нибудь, что я не мог бы подумать о? Может быть названы трубы как-то обескуражены или медленно? Что CHMOD я должен использовать на именованный канал для обеспечения максимальной безопасности? Я до сих пор, чтобы открыть именованный канал в моей основной программе и открытая система называть себя может блокировать. Это еще быстрее, чем при использовании подключения? Моя главная задача здесь замедляет основной процесс из-за блокировки системных вызовов. Запросы локон может быть медленным, я не забочусь о тех, но основной процесс должен использовать лишь система потенциально блокирующие вызовы, как это возможно.
Спасибо заранее, кто вы, кто может дать конструктивную обратную связь для моей проблемы / решения.