Передача данных между двумя программами

Модератор: Модераторы разделов

Se9a
Сообщения: 67
ОС: openSUSE 11

Передача данных между двумя программами

Сообщение Se9a »

Есть две, непрерывно работающие программы (с++). Первая периодически выдает набор данных. Вторая ожидает эти данные, получив их производит некоторые действия и ожидает следующую порцию данных.
Помогите грамотно такой механизм реализовать. Можно через файл (первая записывает в файл, вторая читает из этого файла), но как следить за завершением записи в этот файл? Или может есть другой способ?
Спасибо.
Спасибо сказали:
Аватара пользователя
deadhead
Сообщения: 1913
Статус: zzz..z

Re: Передача данных между двумя программами

Сообщение deadhead »

[x] close
Спасибо сказали:
Se9a
Сообщения: 67
ОС: openSUSE 11

Re: Передача данных между двумя программами

Сообщение Se9a »

Если не сложно, дайте пример на с++, как используя чтение, запись и блокировку доступа к файлу организовать передачу данных между приложениями?
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Передача данных между двумя программами

Сообщение eddy »

Для записи в ФИФО:

Код: Выделить всё

#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 - патриотичная кодировка Изображение
Спасибо сказали:
Se9a
Сообщения: 67
ОС: openSUSE 11

Re: Передача данных между двумя программами

Сообщение Se9a »

А подскажите, как организовать FIFO используя синтаксис не С а C++, т.е. потоки ofstream, ifstream и т.д.?
Спасибо сказали:
Аватара пользователя
korvin
Сообщения: 39
ОС: >_<

Re: Передача данных между двумя программами

Сообщение korvin »

Se9a писал(а):
05.02.2010 16:37
А подскажите, как организовать FIFO используя синтаксис не С а C++, т.е. потоки ofstream, ifstream и т.д.?

вместо
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

Re: Передача данных между двумя программами

Сообщение AestheteAnimus »

Se9a писал(а):
05.02.2010 16:37
А подскажите, как организовать FIFO используя синтаксис не С а C++, т.е. потоки ofstream, ifstream и т.д.?

Зачем, чтобы поиметь проблемы с буферизованным вводом/выводом?
Спасибо сказали: