Коммуникация между Go и Си
От: Мёртвый Даун Чехия  
Дата: 26.07.21 13:27
Оценка:
В Go я совсем ноль. Досталось тут в наследство: прога на Go, и прога на C. Они коммуницируют через файловые дескрипторы stdin и stdout. Прога на С пишет строки в stdout, прога на Go читает эти строки и парсит.
Как-то всё это раньше летало, потом перестало.

Немного поисследовал: работает, работает, потом бац в какой-то момент просто ничего не происходит, т.е. ничего не пересылается. Но ничего не падает. Чо может быть не так?

Какие еще есть способы IPC между Go и С?
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ!
Отредактировано 26.07.2021 13:29 Мёртвый Даун . Предыдущая версия .
Re: Коммуникация между Go и Си
От: reversecode google
Дата: 26.07.21 14:02
Оценка: +1
обратитесь к тому кто обновил там линукс
Re: Коммуникация между Go и Си
От: SаNNy Россия  
Дата: 26.07.21 14:16
Оценка:
Здравствуйте, Мёртвый Даун, Вы писали:

МД>В Go я совсем ноль. Досталось тут в наследство: прога на Go, и прога на C. Они коммуницируют через файловые дескрипторы stdin и stdout. Прога на С пишет строки в stdout, прога на Go читает эти строки и парсит.

МД>Как-то всё это раньше летало, потом перестало.

МД>Немного поисследовал: работает, работает, потом бац в какой-то момент просто ничего не происходит, т.е. ничего не пересылается. Но ничего не падает. Чо может быть не так?


МД>Какие еще есть способы IPC между Go и С?


можно попробовать thrift
Re: Коммуникация между Go и Си
От: gyraboo Россия  
Дата: 26.07.21 14:28
Оценка:
Здравствуйте, Мёртвый Даун, Вы писали:

МД>В Go я совсем ноль. Досталось тут в наследство: прога на Go, и прога на C. Они коммуницируют через файловые дескрипторы stdin и stdout. Прога на С пишет строки в stdout, прога на Go читает эти строки и парсит.

МД>Как-то всё это раньше летало, потом перестало.

МД>Немного поисследовал: работает, работает, потом бац в какой-то момент просто ничего не происходит, т.е. ничего не пересылается. Но ничего не падает. Чо может быть не так?


МД>Какие еще есть способы IPC между Go и С?


Именованные каналы тоже вроде должны работать.
www.nanonewsnet.ru
Re: Коммуникация между Go и Си
От: Слава  
Дата: 26.07.21 16:37
Оценка: 2 (1)
Здравствуйте, Мёртвый Даун, Вы писали:

МД>Немного поисследовал: работает, работает, потом бац в какой-то момент просто ничего не происходит, т.е. ничего не пересылается. Но ничего не падает. Чо может быть не так?


Deadlock на блокирующем чтении. Классика в пайпах.

А и Б читают и пишут по очереди. Пока не запишут — не начинают читать. В некий момент буфер между процессами переполняется и очередная запись замирает, блокируется до того момента, пока из буфера не прочитают на другой стороне. А на той стороне в это время тоже пишут, а не читают, и запись так же заблокировалась.

Есть радикальное решение: переход на неблокирующие вызовы чтения-записи.

МД>Какие еще есть способы IPC между Go и С?


Обычный extern C и поехали.
Re[2]: Коммуникация между Go и Си
От: Мёртвый Даун Чехия  
Дата: 26.07.21 18:31
Оценка:
Здравствуйте, Слава, Вы писали:

С>Есть радикальное решение: переход на неблокирующие вызовы чтения-записи.


Куда смотреть?
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ!
Re: Коммуникация между Go и Си
От: Pzz Россия https://github.com/alexpevzner
Дата: 26.07.21 20:16
Оценка: +2
Здравствуйте, Мёртвый Даун, Вы писали:

МД>Немного поисследовал: работает, работает, потом бац в какой-то момент просто ничего не происходит, т.е. ничего не пересылается. Но ничего не падает. Чо может быть не так?


Ну это явно какая-то ошибка логики, языконезависимая.

Попробуй понять, что все же происходит, когда все захрясает. Например, сишная программа перестает писать, или программа на Go перестает читать? Кто кого ждет?

Открой для себя утилиту strace, она помогает заглянуть программе в душу.

МД>Какие еще есть способы IPC между Go и С?


Да стопятьсот их. Такие же, как между C и C, или между Go и Go

Между прочим, из Go можно вызывать Сишные функции практически напрямую.
Re[3]: Коммуникация между Go и Си
От: Слава  
Дата: 26.07.21 22:08
Оценка:
Здравствуйте, Мёртвый Даун, Вы писали:

С>>Есть радикальное решение: переход на неблокирующие вызовы чтения-записи.


МД>Куда смотреть?


https://stackoverflow.com/questions/17022903/dead-lock-linux-pipe

Примерно вот сюда и около, по тем же ключевым словам.

Это всего лишь моё предположение о причинах проблемы, может у вас что-то другое, я не знаю, как диагностировать такую проблему, тут надо netch'а в тред призывать.
Re: Коммуникация между Go и Си
От: vsb Казахстан  
Дата: 26.07.21 22:26
Оценка: +1
Может быть сишная программа не сбрасывает буферы? По умолчанию все функции должны при переводе строки сбрасывать буфер, но мало ли что вы там написали. Для проверки можешь запустить tee filename между вашими программами, она будет записывать всё, что проходит, в filename, ну и ты можешь мониторить этот filename. Если там строчки не появляются, значит программа их не посылает.
Re: Коммуникация между Go и Си
От: Cyberax Марс  
Дата: 27.07.21 04:25
Оценка: +2
Здравствуйте, Мёртвый Даун, Вы писали:

МД>В Go я совсем ноль. Досталось тут в наследство: прога на Go, и прога на C. Они коммуницируют через файловые дескрипторы stdin и stdout. Прога на С пишет строки в stdout, прога на Go читает эти строки и парсит.

Телепатирую....

Видимо, где-то есть код который пишет слишком много данных и вызывает deadlock из-за переполнения буферов в pipe'ах. Особенно часто бывает, когда общение пишут в виде наивных последовательностей: "записать вопрос — прочитать ответ". Решается выносом циклов чтения и записи в отдельные потоки.
Sapienti sat!
Re: Коммуникация между Go и Си
От: ononim  
Дата: 29.07.21 20:51
Оценка:
МД>В Go я совсем ноль. Досталось тут в наследство: прога на Go, и прога на C. Они коммуницируют через файловые дескрипторы stdin и stdout. Прога на С пишет строки в stdout, прога на Go читает эти строки и парсит.
МД>Как-то всё это раньше летало, потом перестало.
если проблема в буферах как тут пишут, то можно подкостылить fcntl(...F_SETPIPE_SZ...). Дефолтовый размер там обычно 64кб, но может быть подкручен административным путем. https://man7.org/linux/man-pages/man2/fcntl.2.html
Как много веселых ребят, и все делают велосипед...
Отредактировано 29.07.2021 20:52 ononim . Предыдущая версия .
Re: Коммуникация между Go и Си
От: VladCore  
Дата: 31.07.21 12:33
Оценка:
Здравствуйте, Мёртвый Даун, Вы писали:

МД>В Go я совсем ноль. Досталось тут в наследство: прога на Go, и прога на C. Они коммуницируют через файловые дескрипторы stdin и stdout. Прога на С пишет строки в stdout, прога на Go читает эти строки и парсит.

МД>Как-то всё это раньше летало, потом перестало.

МД>Немного поисследовал: работает, работает, потом бац в какой-то момент просто ничего не происходит, т.е. ничего не пересылается. Но ничего не падает. Чо может быть не так?


МД>Какие еще есть способы IPC между Go и С?


еще дидлок будет если криво чтение сделано и stdout и stderr. в Go части только stdout вычитывается или stderr тоже?

ну а корень проблемы в том что нет интеграционных тестов где бы это взаимодействие покрывалось с внятными ошибками.
Отредактировано 31.07.2021 12:48 VladCore . Предыдущая версия .
Re: Коммуникация между Go и Си
От: Hobbes Россия  
Дата: 31.07.21 12:41
Оценка:
Здравствуйте, Мёртвый Даун, Вы писали:

МД>Какие еще есть способы IPC между Go и С?


Тебе именно IPC надо? Просто как либу подлинковать — нет?

А вообще какие есть способы IPC — сокеты, shared memory, RPC.
Re: Коммуникация между Go и Си
От: novitk США  
Дата: 07.10.21 14:47
Оценка:
Здравствуйте, Мёртвый Даун, Вы писали:

МД>Немного поисследовал: работает, работает, потом бац в какой-то момент просто ничего не происходит, т.е. ничего не пересылается. Но ничего не падает. Чо может быть не так?

МД>Какие еще есть способы IPC между Go и С?

Писатель и читатель многопотоковые? если да, то скорее всего происходит то что Cyberax написал. Я бы сначала убрал МП и посмотрел что будет. Переход на другой IPC эту проблему не решит.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.