This is an old revision of the document!
Pentru parcurgerea demo-urilor, folosim arhiva aferentă. Demo-urile rulează pe Linux. Descărcăm arhiva folosind comanda
user@host:~$ wget http://elf.cs.pub.ro/so/res/cursuri/curs-02-demo.zip
și apoi decomprimăm arhiva
user@host:~$ unzip curs-02-demo.zip
și accesăm directorul rezultat în urma decomprimării
user@host:~$ cd curs-02-demo/
Acum putem parcurge secțiunile cu demo-uri de mai jos.
Pentru a afișa tabela de descriptor de fișier a procesului shell current (PID-ul său este reținut în construcția $$
), folosim comanda
user@host:~$ lsof -a -d 0-1023 -p $$
Ce referă descriptorii 0, 1, 2?
De ce (pe unele sisteme) descriptorul 0 este marcat 0r
(adică read-only)?
Vrem să investigăm descriptorii de fișiere pentru procesele daemon din sistem. Pentru început vrem să aflăm procesele daemon din sistem; procesele daemon au ca proces părinte procesul init
(procesul cu PID-ul 1
) și vom folosi comanda de mai jos pentru a le afla:
user@host:~$ ps --ppid 1
Pentru unul dintre procesele daemon descoperite prin rularea comenzii anterioare , afișam tabela de descriptori (e nevoie de drept de root
) folosind comanda lsof
:
root@host:~# sudo lsof -a -d 0-1023 -p $PID
Mai sus, construcția $PID
referă PID-ul procesului daemon inspectat.
Ce referă descriptorii 0, 1, 2? De ce?
Ce alți descriptori sunt folosiți? Ce referă acești descriptori?
Vrem să vedem cum se modifică descriptorii de fișier în cazul redicterării. Pentru a putea vedea acest lucru vom rula o comandă de durată (sleep
) și vom redirecta intrarea și ieșirea standard:
user@host:~$ sleep 100 < /etc/passwd > f.txt
Pentru a investiga procesul sleep
proaspăt porni, trebuie să știm PID-ul său. Deschidem o altă consolă și aflăm PID-ul procesului sleep
creat folosind comanda:
user@host:~$ pidof sleep
Vom folosi onstrucția $PID
referă PID-ul procesului sleep
pe care-l investigăm. Ca și până acum, afișam tabela de descriptori de fișier a procesului folosind comanda:
user@host:~$ lsof -a -o -d 0-1023 -p $PID
Ce referă acum descriptorul 0, respectiv 1?
Vrem să urmărim modificarea cursorului de fișier (numit și file pointer sau file offset). Pentru aceasta vom folosi un program C în care, la cererea utilizatorului folosim apeluri care alterează cursorul de fișier: write
și lseek
,
Pentru început intrăm în directorul c-file-ops/
din directorul cu demo-uri și urmărim fișierul c-file-ops.c
. Observăm că în program se deschide fișierul f.txt
și apoi se scrie (folosind write
) și se parcurge fișierul (folosind lseek
). Fiecare operație este precedată de apăsarea tastei ENTER din parte utilizatorului. Compilăm programul folosind comanda
user@host:~$ make
și obținem executabilul c-file-ops
. Rulăm executabilul c-file-ops
:
user@host:~$ ./c-file-ops
Pentru a urmări evoluția tabelei de descriptori și a cursorului de fișier, vom folosi comanda lsof
. Într-o altă consolă rulăm comanda
user@host:~$ lsof -a -o -d 0-1023 -p $(pidof c-file-ops)
Pentru început sunt afișați doar descriptorii standard.
Pentru a urmări evoluția tabelei de descriptori de fișier și a cursorului de fișier, vom folosi ENTER
în consola în care am rulat executabilul c-file-ops
. Vom urmări evoluția programului în consola în care am rulat lsof
.
OFFSET
indică poziția cursorului de fișier.
Inițial cursorul de fișier are valoarea 0
întrucât a fost proaspăt deschis și trunchiat. La apăsarea tastei ENTER
în prima consolă, care indică programul să facă o nouă acțiune, observăm modificarea cursorului de fișier în a doua consolă.
Parcurgem întreg programul pentru a urmări evoluția completă a cursorului de fișier.
La finalul rulării programului urmărim dimensiunea fișierului f.txt
:
user@host:~$ stat -c "%s" f.txt 256
Observăm că fișierul are dimensiunea de 256 octeți, atât cât a primit ca argument apelul ftruncate
.
Ce efect are apelul ftruncate
asupra cursorului de fișier?
py-file-ops/
din arhiva cu demo-uri a cursului.py-file-ops.py
.python py-file-ops.py
ps -ef | grep py-file-ops lsof -a -o -d 0-1023 -p $PID
$PID
este process ID-ul obținut la prima comandă.py-file-ops
și urmăriți evoluția programului în consola în care ați rulat lsof
.OFFSET
indică file pointer-ul (cursorul de fișier, file offset).f.flush()
(după ciclul de scriere cu f.write()
)?buffered-system-io/
din arhiva cu demo-uri a cursului.buffered.c
și system.c
.make
buffered
:./buffered
ltrace -e putchar,fputc -p $(pidof buffered)
strace -e write -p $(pidof buffered)
system
:./system
ltrace -e write -p $(pidof system)
strace -e write -p $(pidof system)
open-dup/
din arhiva cu demo-uri a cursului.open.c
și dup.c
.make
open
și dup
.open
:./open
watch -d lsof -a -o -d 0-1023 -p $(pidof open)
open
și urmăriți evoluția programului în consola în care ați rulat lsof
.OFFSET
indică file pointer-ul (cursorul de fișier, file offset).dup
.