Projekt shell - usterka, atrybuty terminala w podprocesach

Projekt shell - usterka, atrybuty terminala w podprocesach

by Tomasz Stachowski -
Number of replies: 1

Uruchamiając zadanie w tle, a następne wpisując 'fg', atrybuty terminala zostają poprzestawiane w zły sposób na czas działania zadania.

Przykłady:

i) 'wc -c' zaraz po wznowieniu wypisuje 0 i się kończy (czyli dostał EOF):

wc -c &
fg

ii) Możemy skompilować 

 #include <stdio.h>
int main()
{
for(int i=0;i<10;i++)
printf("%d",getchar());
return 0;
}

i zobaczyć, że rzeczywiście, gdy zrobimy

./a.out &
fg

to widzimy, że program za każdą próbą odczytu ze standardowego wejścia dostanie EOF.

iii) Gdy w naszym shellu uruchomimy kolejnego ./shell, to uruchomiony ./shell wykonuje polecenia, ale terminal nie wyświetla wpisywanych przez nas znaków oraz "dziwnie" formatuje białe znaki na wyjściu:

./shell &
fg
ls

 

Zgaduję, że uruchamiając zadanie w tle, nigdy nie nadpisujemy jego tmodes, a po wpisaniu 'fg' wykonujemy Tcsetattr(), zerując wszystkie atrybuty terminala.

In reply to Tomasz Stachowski

Odp: Projekt shell - usterka, atrybuty terminala w podprocesach

by Krystian Bacławski -

Dziekuję za zgłoszenie usterki. Rzeczywiście istniała ścieżka, gdzie job->tmodes było zainicjowane samymi zerami zamiast stanem terminala, który zastała powłoka. Poniższa łatka naprawia błąd.

diff --git a/projekt-shell/jobs.c b/projekt-shell/jobs.c
index 536c2cb..3533c2f 100644
--- a/projekt-shell/jobs.c
+++ b/projekt-shell/jobs.c
@@ -90,6 +90,7 @@ int addjob(pid_t pgid, int bg) {
   job->command = NULL;
   job->proc = NULL;
   job->nproc = 0;
+  job->tmodes = shell_tmodes;
   return j;
 }

Można ją zaaplikować wydając polecenie patch -p2 < łatka w katalogu projekt-shell.