Sunteți pe pagina 1din 11

Lab1.

1.1. V-ati logat cu user-ul linux1. Sunteti in directorul radacina. Ce comanda trebuie sa dati ca sa afisati
fisierele aflate pe Desktop?

ls /home/linux1/desktop

1.2. Un folder denumit 'aaa' contine un fisier 'bbb'. Cu ce comanda (sau sir de comenzi) poate fi sters
folderul?

rm -r aaa

1.3. Ce comanda trebuie sa dati pentru afisarea unei linii care sa indice ID-ul procesului cu denumirea
'bash'?

ps –C bash

1.4. Precizati cum se poate vizualiza cu programul vim fisierul 'my_file' din directorul curent. Ce trebuie
facut pentru a putea edita fisierul in vim? Cum se salveaza fisierul, si cum se iese din program?

vi my_file
Pentru a edita fisierul dup ace se intra in el se apasa insert si se scrie in el apoi pentru a se salva se
apasa esc si se scrie in linia de comanda a programului vim urmatoarea comanda !w .

1.5. Linux nu ofera o comanda de rename. Ce alta comanda poate fi folosita pentru a modifica numele
unui fisier?

Poate fi folosita comanda de move sau copy move/copy sursa destinatie

1.6. Comanda ls -l ofera o lista de directoare, link-uri (shortcut-uri) si fisiere in ordine alfabetica. Ce
trebuie adaugat la aceasta comanda pentru a vi se afisa in orice ordine, insa intai directoarele, apoi link-
urile, apoi fisierele? Indicatie: primul caracter de pe fiecare linie este 'd' daca linia specifica un director,
'l' daca linia specifica un link si '-' daca specifica un fisier. Caracterul '-' are cod ASCII mai mare decat o
litera.

1.7. Cum puteti termina un proces cu ID-ul 12345? Dar un proces cu numele 'nume_proces'?

kill 12345
killall nume_proces

1.8. Care e diferenta dintre hard links si soft links?

Hard links sunt listari care contin informatii despre fisier pe cand soft links seamana mai mult cu
comenzile rapide din Windows. Alte diferente sunt:
1) Nu puteti crea un hardlink pentru un director
2) Daca eliminate fisierul original al unul hardlink, link-ul tot va arata continutul fisierului
3) Un softlink poate fi legatura catre un director
4) Un softlink, la fel ca o comanda rapida din Windows, devine inutila dupa ce este sters fisierul
original.

1.9. Se doreste schimbarea drepturilor de acces al unui fisier astfel: user-ul owner al fisierului sa poata
citi, scrie sau executa fisierul; user-ii din grupul care detine fisierul sa poata citi sau scrie fisierul; toti
ceilalti useri sa nu poata decat sa citeasca fisierul. Ce comanda si cu ce parametrii trebuie folosita?

chmod 764 fle

Lab2.

2.1. Intr-un script bash, care sunt diferentele dintre ghilimele(""), apostroafe('') si ghilimele intoarse(``)?
Dati exemple.

"" nu ascund caracterul "$", de exemplu.


salut="buna dimineata $LOGNAME"
echo $salut
va afişa:  buna dimineata linux1

' ' - sunt cele mai puternice caractere de ascundere. Ele ascund şi caracterul "$". De exemplu:
salut='bună dimineaţa $LOGNAME'
echo $salut
va afişa: bună dimineaţa $LOGNAME

` ` - se folosesc când este nevoie de rezultatul unei comenzi în interiorul altei comenzi:
contents=`ls` - execută comanda 'ls' şi stochează rezultatul acestei comenzi  în variabila contents.

2.2. Scrieti un script care afiseaza cate unul pe linie toti parametrii primiti. Precizati cum arata comanda
care executa scriptul cu urmatorii 3 parametri: 'qwe', 'rty' si 'uio'.

#1 /bin/bash
echo $1
echo $2
echo $3

./file qwe rty uio

2.3. Ce face urmatorul script? Ce realizeaza expresia `seq 10` si de ce se foloseste impreuna cu for?

for i in `seq 10`


do
echo $i
done

Afiseaza fiecare element din lista seq10. Expresia seq10 este o lista de elemente.
2.4. Ce face instructiunea shift? Cum poate fi folosita pentru a afisa la consola toti parametrii primiti?

Instrucţiunea shift mută valoarea curentă stocată  în parametrul poziţional cu o poziţie la stânga.

2.5. Scrieti un script care declara 5 variabile (a, b, c, d, e) care iau valorile de la 1 la 5, apoi printeaza la
consola rezultatul expresiei a + b * (c - d) + e.

#! /bin/bash
a=1
b=2
c=3
d=4
e=5
f = $[$a+$b*($c+$d)+$e]
echo $f

2.6. Ce face urmatorul script?

for f
do
tr a-z A-Z < $f >$f.up
done

Foloseste orice numar de fisiere text pe care le citeste, le converteste toate literele in majuscule si le
salveaza cu acelasi nume dar cu extensia up.

2.7. Scrieti un script care sa contina o functie patrat, care primeste ca parametru un intreg si afiseaza
patratul numarului primit. Apelati functia pentru a afisa patratul unui numar oarecare.

#! /bin/bash
r=$[$1*$1]
echo $r

./file 2

2.8. Scrieti un script care primeste ca parametru un fisier cu o extensie oarecare (ex. fis.input) si care
afiseaza fisierul cu extensia schimbata in out (ex. fis.out). Parametrul primit e o variabila cu numele 1
(accesata cu $1). Scriptul nu are nevoie sa fie mai lung de un rand (o comanda).

mv $1 $1.out

Lab3.

3.1. Explicati optiunile -c, -g ale comenzii gcc.


Opţiunea "-c": generează doar cod obiect (extensia .o), fără asamblare şi editare de legături.
"-g": GCC va genera informaţii folosite la depanare (cu depanatorul gdb)  

3.2. Explicati optiunile -o, -Wall ale comenzii gcc.


 "-Wall":  activeaza diverse warning-uri compilatorului
“-o”: se foloseste pentru a specifica un alt nume pentru fisierul executabil

3.3. In gdb, ce face comanda run daca este data imediat dupa ce se intra in debugger? (tocmai am dat
comanda gdb ./fisier_executabil). Ce trebuie facut pentru a opri executia intr-un punct al programului?

Comanda run va executa programul care este in depanare.


Pentru a opri executia folosim urmatoarea comanda (gdb) break nr, unde nr reprezinta linia unde
vrem sa se opreasca.

3.4. Explicati comenzile 'watch' si 'shell' din debugerul gdb.


watch - permite examinarea unei variabile a programului ori de câte ori variabila se modifică
shell - execută comenzi shell

3.5. Presupunem ca facem debugging pe urmatorul cod:

1: int func_1(int a) {
2: return a * 2;
3: }
4:
5: int func_2(int b) {
6: int a;
7: a = 1;
8: a = func_1(a + b);
9: a *= b;
10: return a;
11: }

Suntem in consola programului gdb. Am pus un breakpoint pe functia func_2, am rulat programul si am
ajuns pe linia 7. Ce comanda trebuie data pentru a executa programul pas cu pas fara a intra in functia
func_1? Ce comanda trebuie data pentru a rula pas cu pas pe rand liniile 7, 8, 2, 9, 10? (se intra in
functia func_1)

3.6. Ce este un target a unui fisier Makefile? Ce sunt dependintele unui target?
target = numele unui fisier ce trebuie generat sau numele unei actiuni
dependencies = lista de actiuni (fisiere) ce trebuie indeplinite (ce trebuie sa existe) pentru a se realiza
target-ul – make determina daca trebuie re-executat target-ul daca una dintre dependete s-a
modificat (unul din fisierele din lista de dependente s-a modificat)

3.7. Se da urmatorul fisier Makefile:

pregatire: mancare curatenie


echo "Putem primi musafiri"
touch pregatire
mancare: cumparaturi
echo "Gata MANCARE"
touch mancare
curatenie:
echo "Gata CURATENIE"
touch curatenie
cumparaturi:
echo "Gata CUMPARATURI"
touch cumparaturi
pierde_cumparaturi:
rm -f cumparaturi
echo "pierdut CUMPARATURI"

Ce se afiseaza cand se executa comanda 'make pregatire'?


Dar daca se executa o a doua oara 'make pregatire'?
Acum se executa 'make pierde_cumparaturi'. Ce se va afisa la o a treia executie a comenzii 'make
pregatire'?

Executia comenzii ‘make pregatire’:


echo "Gata CUMPARATURI"
Gata CUMPARATURI
touch cumparaturi
echo "Gata MANCARE"
Gata MANCARE
touch mancare
echo "Gata CURATENIE"
Gata CURATENIE
touch curatenie
echo "Putem primi musafiri"
Putem primi musafiri
touch pregatire

Executia a doua ‘make pregatire’:


echo "Gata CUMPARATURI"
Gata CUMPARATURI
touch cumparaturi
echo "Gata MANCARE"
Gata MANCARE
touch mancare
echo "Putem primi musafiri"
Putem primi musafiri
touch pregatire

Executia a treia ‘make pregatire’:


echo "Gata CUMPARATURI"
Gata CUMPARATURI
touch cumparaturi
echo "Gata MANCARE"
Gata MANCARE
touch mancare
echo "Putem primi musafiri"
Putem primi musafiri
touch pregatire

3.8. Se da urmatorul fisier Makefile:

pregatire: mancare curatenie


echo "Putem primi musafiri"
touch pregatire
mancare: cumparaturi
echo "Gata MANCARE"
touch mancare
curatenie:
echo "Gata CURATENIE"
touch curatenie
cumparaturi:
echo "Gata CUMPARATURI"
touch cumparaturi
clean:
rm -f cumparaturi
rm -f curatenie
rm -f mancare
rm -f pregatire
echo "Gata ANULARE"

Ce se afiseaza cand se executa comanda 'make pregatire'?


Dar daca se executa o a doua oara 'make pregatire'?
Acum se executa 'make clean'. Ce se va afisa la o a treia executie a comenzii 'make pregatire'?

Prima executie “make pregatire”


echo "Gata CUMPARATURI"
Gata CUMPARATURI
touch cumparaturi
echo "Gata MANCARE"
Gata MANCARE
touch mancare
echo "Gata CURATENIE"
Gata CURATENIE
touch curatenie
echo "Putem primi musafiri"
Putem primi musafiri
touch pregatire
A doua executie “make pregatire”
echo "Gata CUMPARATURI"
Gata CUMPARATURI
touch cumparaturi
echo "Gata MANCARE"
Gata MANCARE
touch mancare
echo "Putem primi musafiri"
Putem primi musafiri
touch pregatire

A treia executie “make pregatire”


echo "Gata CUMPARATURI"
Gata CUMPARATURI
touch cumparaturi
echo "Gata MANCARE"
Gata MANCARE
touch mancare
echo "Gata CURATENIE"
Gata CURATENIE
touch curatenie
echo "Putem primi musafiri"
Putem primi musafiri
touch pregatire

3.9. Ambele fisiere Makefile de mai jos compileaza un fisier executabil 'a2' din doua fisiere sursa 'a21.c'
si 'a22.c'. Ce avantaj prezinta 'Makefile_1' fata de 'Makefile_2'?

Fisier Makefile_1:

a2: a21.o a22.o


gcc a21.o a22.o -o a2
a21.o: a21.c
gcc -c a21.c
a22.o: a22.c
gcc -c a22.c

Fisier Makefile_2:

build: a21.c a22.c


gcc -c a21.c
gcc -c a22.c
gcc a21.o a22.o -o a2
Lab4.

4.1. Ce face apelul de sistem fork()? Ce returneaza acesta?


Apelul de sistem fork() creaza un proces, având ca rezultat crearea unui context de proces si executia
programului în acel context.

4.2. La ce poate fi folosit apelulde sistem execv()? Ce semnificatie are valoarea returnata de acest apel?
Apelul sistemului execv() creaza un process.

4.3. Un program va rula urmatorul cod:

#include <pthread.h>
#define MAXN 999999

int A[MAXN];
int contor = 0;
pthread_mutex_t mutex;

void* thread_func(void* arg) {


int i;
pthread_mutex_lock(&mutex);
for (i = 0; i < MAXN / 3; i++)
A[contor++] = (int)arg;
pthread_mutex_unlock(&mutex);
return NULL;
}
int main() {
pthread_t thread1, thread2, thread3;
pthread_mutex_init(&mutex, NULL);
pthread_create(&thread1, NULL, thread_func, (void*)1);
pthread_create(&thread2, NULL, thread_func, (void*)2);
pthread_create(&thread2, NULL, thread_func, (void*)3);
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
pthread_join(thread3, NULL);
pthread_mutex_destroy(&mutex);
return 0;
}

Ce elemente va contine vectorul A la sfarsitul programului? Dar daca sunt eliminate apelurile
pthread_mutex_lock(&mutex) si pthread_mutex_unlock(&mutex) ?

4.4. Un program va rula urmatorul cod:


#include <pthread.h>
#include <stdio.h>

pthread_mutex_t mutex;

void* func_1(void* arg) {


pthread_mutex_lock(&mutex);
printf("1.1\n");
sleep(1); // thread sleeps for 1 second
printf("1.2\n");
pthread_mutex_unlock(&mutex);
return NULL;
}
void* func_2(void* arg) {
pthread_mutex_lock(&mutex);
printf("2.1\n");
sleep(5); // thread sleeps for 5 seconds
printf("2.2\n");
pthread_mutex_unlock(&mutex);
return NULL;
}
int main() {
pthread_t thread1, thread2;
pthread_mutex_init(&mutex, NULL);
pthread_create(&thread1, NULL, func_1, NULL);
pthread_create(&thread2, NULL, func_2, NULL);
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
pthread_mutex_destroy(&mutex);
return 0;
}

Ce va fi afisat la executia programului? Dar daca sunt eliminate apelurile pthread_mutex_lock(&mutex)


si pthread_mutex_unlock(&mutex) din functiile func_1 si func_2?

4.5. Ce credeti ca se va intampla cand se incearca executia urmatorului program? Explicati-va opinia.

int main() {
while (1) {
fork();
}
}

Programul va creea procese la infinit. Deoarece linia while(1) inseamna executie la infinit.
4.6. Ce fac apelurile de sistem open, read, write si close? Ce intelegeti prin termenul 'descriptor de
fisier'?

open – obtine file descriptorul (fd)


read/write – citeste sa scrie in caractere
close – inchide fisierul deschis cu open
Un descriptor de fisier este un numar intreg nenegativ atribuit la deschiderea fisierului si este valabil
pana la inchiderea acelui fisier.

4.7. Ce afiseaza urmatorul program? Motivati-va raspunsul. (se presupune ca apelurile fork si waitpid vor
functiona fara erori).

#include <unistd.h>
#include <stdio.h>

int main() {
int a = 3;
int status;
pid_t child_pid = fork();

if (child_pid > 0) {
a = 4;
printf("a=%d\n", a);
}
else {
pid_t waited_pid = waitpid(child_pid, &status, 0);
printf("a=%d\n", a);
}
return 0;
}

Programul afieaza “a=4” deoarece executia fork() creeaza un proces cu pid-ul egal cu cel al parintului.

4.8. Precizati o asemanare si o deosebire intre apelurile pthread_join(...) si waitpid(...).


pthread_join() intrerupe procesul care se executa.
waitpid() asteapta terminarea unui anumit process.

Lab5.

5.1. De ce nu se pot utiliza in programarea de kernel apeluri de librarie (malloc, printf) sau apeluri de
sistem (open, fork)?

Programarea kernel se bazeaza pe un API nou si independent, ce nu are legatura cu API-ul din user-
space.

5.2 Ce functii trebuie sa contina minim un modul de kernel? Care sunt rolurile acestora?
Functiile pe care trebuie sa le contina un modul de kernel sunt dummy_init() si dummy_exit().
dummy_init() – initializeaza modulul.

5.3 Care este rolul fisierului Kbuild din acelasi folder cu fisierul sursa al unui modul de kernel?
Un fisier Kbuild identifica numele programului de compilat. De exemplu, daca Kbuild contine linia obj-
m = hello.o, se va obtine un modul cu numele hello.ko din sursa hello.c.

5.4 Se da sursa unui modul de kernel simplu, impreuna cu fisierele Kbuild si Makefile aferente.

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>

MODULE_DESCRIPTION("My kernel module");


MODULE_AUTHOR("Me");
MODULE_LICENSE("GPL");

int dummy_init(void) {
printk(KERN_DEBUG "Hello\n");
return 0;
}
void dummy_exit(void) {
printk(KERN_DEBUG "Goodbye\n");
}
module_init(dummy_init);
module_exit(dummy_exit);

Ce workflow de comenzi trebuie urmat pentru a vedea mesajele Hello si Goodbye?

echo qwerty > file


dmesg

5.5 De ce este necesara configurarea kernelului inainte de compilare? Care sunt efecte configurarii?

5.6 Ce se intampla cand sistemul de operare intampina o eroare in kernel sau intr-unul din modulele
sale? Care este diferenta fata de o eroare non-kernel, dintr-un proces oarecare (de exemplu un program
scris de noi)?