Obsługa przekierowań wejścia z terminala (linux)

1

Cześć!
Piszę pod linuxa odpowiednik programu less z wykorzystaniem ncurses i mam problem z obsługą przekierowań.
Chcę aby dane można było podawać do programu na takie sposoby:

program plik
dane | program
program < plik

O ile obsługa pierwszego przypadku jest prosta gdyż argc zwraca liczbę argumentów ( 2 ) to w innych przypadkach mam problemy.
Gdy program wywołuję w taki np sposób: ls -l | program to dane mogę sobie odczytać ze standardowego wejścia,
więc robię to tak:

while(getline(cin, line))

i zapisuję sobie kolejne linie do bufora. Jak potem wrócić do standardowego wejścia? stdin jest podmieniony i ncurses dziwnie się zachowuje, czyta ciągle -1. Przeszukując fora znalazłem takie rozwiązanie: stdin = fopen("/dev/tty", "r");

 Czyjest ono w miarę uniwersalne pod systemami linuxowymi? Dzięki niemu ncruses przestaje samoczynnie wczytywać ciągle -1 i pobiera dane wprowadzane z klawiatury.
Drugi mój problem polega na obsłudze wywołania programu prostym poleceniem: `program</code>Podpada on pod drugi i trzeci sposób gdyż argc = 1 lecz program zapętla się na wczytywaniu wyżej wymienioną pętlą while<code class="cpp">(getline(cin, line))` która w przypadku wywołań 
```cpp
dane | program
program < plik

działa idealnie.
Jakim warunkiem to obsłużyć? Próbowałem takim sposobem:

if(stdin == fopen("/dev/tty", "r")) /*Chodzi mi o sprawdzenie czy stdin nie jest podmieniony przez przekierowanie więc użytkownik nie dał żadnych danych do programu*/
{
	cout <<"Wrong filename!"<<endl;
}
else
{
	while(getline(cin, line))
	{
		/*do bufora*/
	}
}

ale nie chce śmigać dalej się zapętla.
Dodatkowo wklejam cały blok odpowiedzialny za obsługę wejścia gdy argc = 1 czyli jest przekierowane oraz stdin jest przywracany sposobem wyżej podanym:

else if(argc == 1)
{
	if(stdin == fopen("/dev/tty", "r"))
	{
		cout <<"Wrong filename!"<<endl;
		run = false;
	}
	else
	{
		while(getline(cin, line))
		{
			/*do bufora*/
		}
		stdin = fopen("/dev/tty", "r");
		run = true;
	}

}

Wszystko działa dobrze ( na moim systemie ) ale uruchomenie programu program zawiesza go.
Jak temu zaradzić?

0

Jeśli ktoś kiedyś miałby podobny problem to dla potomnych napiszę:
Jak chcemy sprawdzić pod linuchem czy wejście/wyjśćie jest terminalem użwamy funkcji isatty() z biblioteki unistd.h
Aby rozwiązać mój problem należało użyć warunku

if(isatty(fileno(stdin)))

zamiast if(stdin == fopen("/dev/tty", "r"))

pozdr

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