piszę pager pspg
. Tam muszę rozwiązać następujący problem. Po przeczytaniu z stdin
powinienem ponownie przydzielić stdin
z poprzedniego czytania z rury do czytania z terminalu.Jak wykryć urządzenia terminala przypisanego do pracy interaktywnej
użyłem
freopen("/dev/tty", "r", stdin)
Ale to nie działa, gdy pager był używany z poleceniem, co nie zostało zrealizowane bezpośrednio
su - someuser -c 'export PAGER=pspg psql somedb'
W tym przypadku, mam błąd: Nie ma takiego urządzenie lub adres.
znalazłem obejście - Teraz kod wygląda następująco:
if (freopen("/dev/tty", "r", stdin) == NULL)
{
/*
* try to reopen pty.
* Workaround from:
* https://cboard.cprogramming.com/c-programming/172533-how-read-pipe-while-keeping-interactive-keyboard-c.html
*/
if (freopen(ttyname(fileno(stdout)), "r", stdin) == NULL)
{
fprintf(stderr, "cannot to reopen stdin: %s\n", strerror(errno));
exit(1);
}
}
Co to jest poprawny sposób, aby wykryć przypisany urządzenie końcowe w tym przypadku?
Ale to rozwiązanie nie jest poprawne. Naprawiono jedną kwestię, ale kolejna nadchodzi. Kiedy someuser jest inny niż bieżący użytkownik, a następnie otworzyć ponownie nie powiedzie się z błąd Permission denied. Więc tego obejścia nie można wykorzystać do moich celów.
Nie rozumiem problemu 'su - -c użytkownika cat'' przeczytać mój terminalu wejście i wyjście w moim terminalu. "poprzednie czytanie z rury do czytania z terminalu.", które nie ma dla mnie sensu. Mówię ci, że ponieważ podejrzewam problem XY, to, co próbujesz zrobić, jest bardzo dziwne. – Stargateur
pager odczytuje dane ze standardowego wejścia, ale musi przełączać się na/dev/tty, aby był interaktywny. Przełącznik to problem. Zwykła aplikacja tego nie robi i używa stdin, stdout przygotowanego przez środowisko macierzyste. Pager jest inny - odczytuje dane ze standardowego wejścia, ale musi też czytać klawiaturę. –