Kartonagnick
молодец, пользуйся. я не собираюсь из-за "авторитетного" мнения какого-то умника на форуме тянуть к плагину на 1кб кода буст ещё на гектар.
Suslik
> молодец, пользуйся. я не собираюсь из-за "авторитетного" мнения какого-то
> умника на форуме тянуть к плагину на 1кб кода буст ещё на гектар.
Мне все равно. Дело то хозяйское.
Suslik
> действительно, всё просто, но дополнительно нужно делать синхронизацию чем-то
> другим, причём межпроцессным.
Ну да, зависит от сложности взаимодействия и того что нужно.
Как правило я делаю просто 2 буфера, 1 передает от A к B, другой от B к A.
Затем идея такая, что в конце буфера (или в начале, но записаться должен последним) писатель записывает флажок "written".
При этом флажок обязательно записывается последним, чтобы гарантировать что в тот момент когда он будет "written", все остальные данные будут гарантированно записаны.
Читатель соответственно проверяет это флажок, и когда он "written", то начинает читать.
Как только всё прочитал, записывает "read".
Если писатель видит что флажок равен "read", значит он может писать новые данные, после чего снова поменять флажок на "written".
Мне хватает, но м.б. тебе действительно больше подойдут пайпы.
возникла неприятная проблема. в линупсах при создании именованного пайпа после вызова mknod() сервер и клиент могут коннектиться к нему в любом порядке и вызов будет блокирующим до тех пор, пока обе стороны не приконнектятся. в винде же, как оказалось, предполагается, что сначала стартует сервер, а потом клиент: https://msdn.microsoft.com/en-us/library/windows/desktop/aa365592(v=vs.85).aspx если же сначала стартануть клиента, то он просто вернёт ошибку, что такого пайпа не существует. как поступить, чтобы сервер и клиент могли ждать друг друга?
Suslik
Его грохать надо физически из фс, а то он там так и остается
Вообще, в линупсах лучше пользоваться unix domain socket'ами, имхо.
я как бы вообще не спрашивал чем мне пользоваться под линуксами и что делать с fifo-файлом. это без сопливых ясно. вопрос был, как организовать связь, чтобы стороны могли стартовать в произвольном порядке, используя pipe и windows.
Suslik
Ну вот ты и столкнулся с минусами пайпа.
Спс. За потраченное время, буду знать что их лучше не использовать (хотя я изначально реализовывал на shared memory, file mapping).
Такая же фигня и с socket'ы была бы.
Suslik
> если же сначала стартануть клиента, то он просто вернёт ошибку, что такого пайпа не существует. как поступить, чтобы сервер и клиент могли ждать друг друга?
Можно попробовать поменять роли. Т.е. если клиент не нашел пайп, то он его создает и сервер уже коннектится к существующему пайпу.
asvp
> Спс. За потраченное время, буду знать что их лучше не использовать (хотя я
> изначально реализовывал на shared memory, file mapping).
shared memory и file mapping требуют дополнительных синхронизаций с помощью других механизмов IPC, обсуждали уже.
да и вовсе это не значит, что с пайпами нельзя законнектиться в произвольном порядке, просто надо узнать, как это делать нормально.
> Можно попробовать поменять роли. Т.е. если клиент не нашел пайп, то он его
> создает и сервер уже коннектится к существующему пайпу.
и получить race condition, если обе стороны одновременно создали по пайпу и получилось два папы.
Suslik
Я не болен :)
Неправильно понял вопрос, думал проблемы именно с линупсом.
Одновременно не создадут - кто-то отвалится на создании, если имена одинаковые, конечно.
Suslik
> и получить race condition, если обе стороны одновременно создали по пайпу и получилось два папы.
Ну тады, "чего желал, то получай".
> да и вовсе это не значит, что с пайпами нельзя законнектиться в произвольном порядке, просто надо узнать, как это делать нормально.
Нормально, в клиент-сервер системе, это когда сервер работает всегда. И клиент, если не может приконнектится к серверу, тупо пытается приконектится.
Suslik
> если обе стороны одновременно создали по пайпу и получилось два папы
Как может получиться два пайпа с одним именем?
Ghost2
> Как может получиться два пайпа с одним именем?
потому что если две стороны вызывают CreateNamedPipe с одинаковым именем, то создаётся два инстанса одного и того же пайпа и связи не происходит. Согласно msdn'у одна сторона всегда вызывает CreateNamedPipe, вторая - CreateFile() с флагом OPEN_EXISTING, иначе концы просто не коннектятся.
А клиент в цикле не может пайп открывать, пока не получится?
Suslik
> то создаётся два инстанса одного и того же пайпа и связи не происходит
А если ограничение на 1 инстанс выставить? Или FILE_FLAG_FIRST_PIPE_INSTANCE?
Тема в архиве.