Есть две, непрерывно работающие программы (с++). Первая периодически выдает набор данных. Вторая ожидает эти данные, получив их производит некоторые действия и ожидает следующую порцию данных.
Помогите грамотно такой механизм реализовать. Можно через файл (первая записывает в файл, вторая читает из этого файла), но как следить за завершением записи в этот файл? Или может есть другой способ?
Спасибо.
Передача данных между двумя программами
Модератор: Модераторы разделов
-
deadhead
- Сообщения: 1913
- Статус: zzz..z
-
Se9a
- Сообщения: 67
- ОС: openSUSE 11
Re: Передача данных между двумя программами
Если не сложно, дайте пример на с++, как используя чтение, запись и блокировку доступа к файлу организовать передачу данных между приложениями?
-
eddy
- Сообщения: 3321
- Статус: Красный глаз тролля
- ОС: ArchLinux
Re: Передача данных между двумя программами
Для записи в ФИФО:
для чтения из ФИФО
(выберите, что вам нужно, лень ковыряться)
Да, можно еще через разделяемую память, неименованный канал, посылкой сигналов или еще как-нибудь.
Код: Выделить всё
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#define FIFO "/var/www/tmp/fifo-data"
FILE *fd;
int a;
int main(){
struct timespec tm, del;
tm.tv_sec = 1; tm.tv_nsec = 500000000;
if((fd = fopen(FIFO, "w")) == NULL){ printf("error reopening fifo.\n"); exit(1);}
setbuf(fd, NULL);
for(a=1; a<100; a++){
if(nanosleep(&tm, &del) != 0) exit(0);
fprintf(fd, "Hello, world\n num=%d\nAnd this is another string\n",a);
}
fclose(fd);
}для чтения из ФИФО
Код: Выделить всё
#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include "killbrothers.h"
#define FIFO "/var/www/tmp/fifo-out"
int f, tmp=0;
char data[256];
void empty_buf(){
int i;
for(i=0;i<256; i++,data[i]=0);
}
int main(){
int cntr;
struct timeval tv;
fd_set rfds;
killbrothers();
umask(0);
mkfifo(FIFO, 0666); // создаем фифо, если его еще нет
f = open(FIFO, O_RDWR|O_NONBLOCK);
setbuf(fdopen(f, "r+"), NULL); // отключаем буферизацию трубы
setbuf(stdout, NULL);
printf("Content-type: multipart/x-mixed-replace; boundary=myboundary\r\n\n");
for(cntr = 0; cntr < 30; cntr ++){ // время жизни процесса - 30 секунд
FD_ZERO(&rfds);
FD_SET(f, &rfds);
tv.tv_sec=1; tv.tv_usec=0; // 1 секунда на ожидание
if(select(f+1, &rfds, NULL, NULL, &tv) > 0){
if(FD_ISSET(f, &rfds)){
read(f, data, 255);
printf("Content-type: text/html\r\n\n");
printf("<html>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=koi8-r\">\n");
printf("<link rel=\"stylesheet\" href=\"/style.css\" type=\"text/css\">\n");
printf("<body>\n<h1>Отклик контроллера:</h1><div id=middle><pre>\n");
printf("%s\n<div id=\"bottext\">timings: %d</div>\n", data, cntr);
printf("</pre></div></body></html>\n");
printf("--myboundary\n");
empty_buf();
}
}
}
write(f,data,255); // откинем обратно порцию данных, которые все равно не увидим...
printf("Content-type: text/html\r\n\n"); // по истечении 30 секунд отправляем запрос на перезагрузку процесса
// (чтобы он умер, если соединение закрыли)
printf("<meta http-equiv=\"refresh\" content=0>\n");
printf("--myboundary\r\n");
close(f);
}(выберите, что вам нужно, лень ковыряться)
Да, можно еще через разделяемую память, неименованный канал, посылкой сигналов или еще как-нибудь.
RTFM
-------
KOI8-R - патриотичная кодировка
-------
KOI8-R - патриотичная кодировка
-
Se9a
- Сообщения: 67
- ОС: openSUSE 11
Re: Передача данных между двумя программами
А подскажите, как организовать FIFO используя синтаксис не С а C++, т.е. потоки ofstream, ifstream и т.д.?
-
korvin
- Сообщения: 39
- ОС: >_<
Re: Передача данных между двумя программами
вместо
printf( fmt, arg1, arg2, ... );
использовать
std::cout << arg1 << arg2 << ... << std::endl;
а вместо
scanf( fmt, var1, var2, ... );
это
std::cin >> var1;
std::cin >> var2;
...
?
ну или как-то так
(© '(define LISP (такой язык-программирования (состоящий-из смайликов (чуть более) (чем целиком)))) lurkmore)
-
AestheteAnimus
- Сообщения: 135
- ОС: FreeBSD 8.0-RELEASE amd64