Необходимо реализовать двустороннюю передачу данных между двумя процессами.
один на фортране (для меня это черный ящик, знаю тока протокол), другой на питоне и С++ (мой).
Фотрановская прога умеет по свистку открывать файл, читать из него данные или открывать файл, писать в него данные.
Всем этим бардаком рулит питон, C++ модуль подцеплен через swig.
Передач много, как правило Fortran->C++, C++-> Fortran по очередно.
И остро стоит вопрос с производительностью - основное время уходит как раз на передачи.
Попробовал сделать через именованные пайпы, один в одну сторону, другой в другую. Но вылезают жуткие праблы с синхронизацией. То С++ два раза достанет из папйпа одно и тоже. То фортран туда ничего не положит. Или положит и сидит ждет чего то... умные люди посоветовали попробовать select (со стороны С++, Fotran-новский код я менять не могу).
Сессия выглядит так - фотрановской программе грят (через управляющий пайп, его она прекрасно читает) сунуть данные в fifo1, потом вызывается С++-я функция которая fifo1 открывает и читает. Или наоборот, фортрану грят открыть файл fifo2 и прочитать из него данные, потом C++ ф-я открывает fifo2 и сует туда что нужно. В приципе хватило бы и одного fifo, но так совсем не работает - что для меня странно, C++-е программы я так женил (файлы открывал fstream-мом).
Кто то что то может откомментировать?
С selectom - пример из манула работает со стандартным вводом, но отказывается работать с пайпом открытым через open (данных не видит, скока их туда не суй).
#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <iostream>
using namespace std;
int main() {
long f=open("fifo",O_RDONLY);
fd_set rfds;
struct timeval tv;
int retval;
cout<<1<<endl;
/* Watch stdin (fd 0) to see when it has input. */
FD_ZERO(&rfds);
FD_SET(f, &rfds);
/* Wait up to five seconds. */
tv.tv_sec = 5;
tv.tv_usec = 0;
cout<<2<<endl;
retval = select(1, &rfds, NULL, NULL, &tv);
/* Don't rely on the value of tv now! */
cout<<3<<endl;
if (retval == -1)
perror("select()");
else if (retval)
printf("Data is available now.\n");
/* FD_ISSET(0, &rfds) will be true. */
else
printf("No data within five seconds.\n");
return 0;
}
Видимо я как то не так открываю файло? разные комбинации флагов положительного эффекта не дали.
Ответ на:
комментарий
от anonymous
Ответ на:
комментарий
от anonymous
Ответ на:
комментарий
от anonymous
Ответ на:
комментарий
от anonymous
Ответ на:
комментарий
от anonymous
Ответ на:
комментарий
от anonymous
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум select() + FD_ISSET() (2012)
- Форум вопрос про select() (2013)
- Форум Помогите разобраться с select (C) (2007)
- Форум как работает select на unnamed pipe? (2016)
- Форум V4L2: ошибка удаления буфера из очереди: недопустимый аргумент (2023)
- Форум Не считывает файл до конца? (2019)
- Форум Немного не правильно (2019)
- Форум select()+pipe()=непонятки.... (2003)
- Форум помогите с select/pipe, плииииз... (2003)
- Форум помогите с select/pipe, плииииз... (2003)