z istream do ostream przez fragment pamięci

0

Cześć!

Potrzebuję połączyć ostream z istream przez dany ograniczony obszar w pamięci.
Tłumaczę o co chodzi:
Są 2 niezależne programy napisane w C++.
Mają swoje odrębne pamięci operacyjne, ale mają wspólny mały fragment pamięci pod adresem 0xXXXX o wielkości ~(256B+64B).
Chciałbym móc odczytać poprzez ostream to co zostało wpisane w istream.

Po zagłębieniu się w działanie strumieni, pojawił się problem z implementacją pbackfail i nie tylko.
Problemem jest to że gdy przesyłane dane są większe od 256B to strumienie muszą działać na przemian, dodatkowo utrudniają to metody, które chcą odczytywać poprzednie dane...

Zresztą, zobaczcie sami (wątpliwości/pytania w komentarzach):


// wspolny obszar pamieci
typedef struct{
	volatile int reading;
	volatile int ir; // index odczytu danych
	volatile int iw; // index zapisu danych
	char data[256];
} mstream_t;


void mstream_init(mstream_t * ms){
	ms->reading = 0;
	ms->iw = ms->ir = 0;
}

class omstream: public std::ostream, std::streambuf
{
private:
	mstream_t * ms;
	
public:
    omstream(mstream_t * mstream) : std::ostream(this), ms(mstream){}
	~omstream(){
		sync();
	}
	
    int sync() {
        dbg("-");
		if(ms->reading == 0){
			ms->reading = 1;
		}
		return 0;
    }
    
	void wait(){
		while(ms->reading); // TODO - sleep
	}
	
    int overflow(int c){
		dbg("-");
		wait();
		ms->data[ms->iw] = c;
		if(++ms->iw == sizeof(ms->data))
			sync();
        return 0;
    }
};

class imstream: public std::istream, std::streambuf
{
private:
	mstream_t * ms;
	
public:
    imstream(mstream_t * mstream) : std::istream(this), ms(mstream){}
	~imstream(){
		sync();
	}
	int sync(){
		if(ms->reading){
			ms->iw = ms->ir = ms->iw > 0; // zostawic troche danych dla pbackfail?
			ms->reading = 0;
		}
		return 0;
	}
	void wait(){
		while(!ms->reading); // TODO - sleep
	}
	int uflow(){
        dbg("-");
		wait();
		if(ms->ir == ms->iw){
			sync();
			return EOF; // TODO return uflow()? - pobranie dalszych danych z omstream
		}
        return ms->data[ms->ir++];
    }
    int underflow(){
        dbg("-");
		wait();
		if(ms->ir == ms->iw){
			sync();
			return EOF; // TODO return underflow() ?
		}
        return ms->data[ms->ir];
    }
    int pbackfail(int ch){
        dbg("-");
		if(ms->ir == ms->iw || (ch != EOF && ch != ms->data[ms->ir-1]))
            return EOF; // TODO 
		ms->ir--;
        return ms->data[ms->ir];
    }
    std::streamsize showmanyc(){
        dbg("unip");
		exit(0);
        return 0;
    }
	
};
0

dlaczego mają wspólną małą pamięć i dlaczego to jest c++, jak zalatuje embeded

1

Klasyczny IPC.
Opisz dokładnie sowje wymagania:
jaki system, jakie biblioteki możesz użyć.

Przykładowo pod Linux takie coś dostaniesz prawie za darmo.
http://pubs.opengroup.org/onlinepubs/009695399/functions/mkfifo.html

1 użytkowników online, w tym zalogowanych: 0, gości: 1