Skocz do zawartości

Proces: Który Tty?


Andrzej Orkan

Rekomendowane odpowiedzi

Słuchajcie, jak się dowiedzieć o nr terminala z jakiego wystartował jakiś proces. Np taka informacja znajduje się po wydaniu polecenia "ps" ale ja właśnie chcę napisać własną wersję polecenia "ps" :) Skąd "ps" bierze informację o TTY? To jest gdzieś w katalogu /proc/(nr_procesu) ?

 

Orkan

Odnośnik do komentarza
Udostępnij na innych stronach

Taką całkiem własną "od bebechów"? Bo jeśli nie to nr terminala można wyciągnąć ze struktury z utmp.h

 

o super! szukałem w utmp ale chyba jakoś niespecjalnie mi wyszło :) które to pole?

Odnośnik do komentarza
Udostępnij na innych stronach

Szczegóły w manie do utmp :) Konkretnie w sekcji 5. man 5 utmp

 

Nie do końca zczaiłeś o co mi chodzi :) UTMP daje informacje o tym z których terminali korzysta sobie pewien user. A ja chcę żeby mój program binarny wypluł mi z którego dokładnie terminala został uruchomiony :) Bo w przypadku kiedy user otworzył sobie kilka terminali to sama informacja UTMP nie wystarczy.

 

Oczywiście mogę przejrzeć cały katalog /proc i znaleźć w którymś z plików /proc/(nr_procesu)/cmdline nazwę mojego programu, tyle że nie wiem gdzie doszukać się informacji z którego tty ten właśnie pid został odpalony.

 

Orkan

Odnośnik do komentarza
Udostępnij na innych stronach

Ano faktycznie... :) Trudno, kombinuj dalej... Jak mnie coś do głowy wpadnie to napiszę.

 

Znalazłem, ale od implementacji dzieli mnie jeszcze kroczek :) Mianowicie w katalogu /proc/(nr_procesu)/fd znajduą się pliki, które są linkami symbolicznymi do odpowiedniego terminala! A teraz pytanie za 100pkt: jak dostać się z poziomu języka C do nazwy pliku na który wskazuje dany symlink. Narazie poruszam się w okolicach funkcji stat() i lstat() ale nie znalazłem rozwiązania.

 

Pomóż :)

Odnośnik do komentarza
Udostępnij na innych stronach

Jaaaa? Ja nie programmer :(;) Może trochę entuzjasta :) Ale popytam w firmie może ktoś coś podpowie.

 

No już znalazłem odpowiedź. Mioanowicie funkcja readlink

 

char buf[1024];
int len;

if ((len = readlink("NAZWA_LINKU", buf, sizeof(buf)-1)) != -1)
    buf[len] = '\0';

printf("%s\n",buf); //WYNIKIEM TEGO PRINTFA BEDZIE NAZWA PLIKU DO KTOREGO LINK SIE ODNOSI

 

ależ jestem z siebie dumny :P Dziex za dobre chęci WalDo

Odnośnik do komentarza
Udostępnij na innych stronach

Dziex za dobre checi WalDo
Dzieki za podanie odpowiedzi, wiekszosc userów nie pisze jak rozwiazalo problem i temat umiera w jakiejs dziwnej i niedokonczonej postaci.

A mnie moze to trochezmotywuje do pisania jakichs chocby niewielkich progosów :)

[Edit] Zapomnialem powiedziec, a to przeciez takie madre ;) Dobrymi checiami pieklo jest wybrukowane ;) Pozdro.

Odnośnik do komentarza
Udostępnij na innych stronach

A mnie może to trochę zmotywuje do pisania jakichś choćby niewielkich progosów :)

 

zacna inicjatywa. ja postanowiłem właśnie coś takiego zrobić, piszę własne wersje różnych usług systemowych. zacząłem od najprostszych typu chmod, who, ps, ls i zmierzam w kierunku różnych zmiennych środowiskowych i takich tam. jak skończę zabiorę się za jakieś rzeczy klient-serwer :)

 

znalazłem w sieci troche dających do myślenia zadań do samodzielnego wykonania

 

pozdro, orkan

 

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...