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? 1.2. Un folder denumit 'aaa' contine un fisier 'bbb'. Cu ce comanda (sau sir de comenzi) poate fi sters folderul? 1.3. Ce comanda trebuie sa dati pentru afisarea unei linii care sa indice ID-ul procesului cu denumirea '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? 1.5. Linux nu ofera o comanda de rename. Ce alta comanda poate fi folosita pentru a modifica numele unui fisier? 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'? 1.8. Care e diferenta dintre hard links si soft links? 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? Lab2. 2.1. Intr-un script bash, care sunt diferentele dintre ghilimele(""), apostroafe('') si ghilimele intoarse(``)? Dati exemple. 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'. 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 2.4. Ce face instructiunea shift? Cum poate fi folosita pentru a afisa la consola toti parametrii primiti? 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. 2.6. Ce face urmatorul script? for f do tr a-z A-Z < $f >$f.up done 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. 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). Lab3. 3.1. Explicati optiunile -c, -g ale comenzii gcc. 3.2. Explicati optiunile -o, -Wall ale comenzii gcc. 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? 3.4. Explicati comenzile 'watch' si 'shell' din debugerul gdb. 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? 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'? 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'? 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? 4.2. La ce poate fi folosit apelulde sistem execv()? Ce semnificatie are valoarea returnata de acest apel? 4.3. Un program va rula urmatorul cod: #include #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 #include 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(); } } 4.6. Ce fac apelurile de sistem open, read, write si close? Ce intelegeti prin termenul 'descriptor de fisier'? 4.7. Ce afiseaza urmatorul program? Motivati-va raspunsul. (se presupune ca apelurile fork si waitpid vor functiona fara erori). #include #include 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; } 4.8. Precizati o asemanare si o deosebire intre apelurile pthread_join(...) si waitpid(...). Lab5. 5.1. De ce nu se pot utiliza in programarea de kernel apeluri de librarie (malloc, printf) sau apeluri de sistem (open, fork)? 5.2 Ce functii trebuie sa contina minim un modul de kernel? Care sunt rolurile acestora? 5.3 Care este rolul fisierului Kbuild din acelasi folder cu fisierul sursa al unui modul de kernel? 5.4 Se da sursa unui modul de kernel simplu, impreuna cu fisierele Kbuild si Makefile aferente. #include #include #include 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? 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)?