Diferență între revizuiri ale paginii „PC Laborator 1”
(→GCC) |
(→GCC) |
||
Linia 259: | Linia 259: | ||
# Deschideți un editor de text. | # Deschideți un editor de text. | ||
# Scrieți într-un fișier nou următorul cod C: | # Scrieți într-un fișier nou următorul cod C: | ||
− | + | <syntaxhighlight lang="c"> | |
#include <stdio.h> | #include <stdio.h> | ||
Versiunea de la data 19 septembrie 2015 09:12
Sistemul de operare Linux - programe
Majoritatea utilizatorilor de Windows pornesc de la premisa că Linux este greu de folosit și că nu pot rula programele cu care sunt obișnuiți în Windows. Cu toate că există, într-adevăr unele aplicații care nu sunt portate și nu pot fi rulate în Linux (cum ar fi o mare parte din jocuri precum și unele platforme foarte specifice de simulare și sinteză), majoritatea aplicațiilor sunt disponibile în Linux. Următoarea listă prezintă alternative ale aplicațiilor tradiționale, care pot fi rulate în Linux:
- browser web: Google Chromium Browser (Chrome), Mozilla Firefox
- player video: VLC Media PLayer
- editor foto: Inkscape, Gimp
- suită office: LibreOffice (alternativă la Microsoft Office), Microsoft Office 365 - online, Google Docs - online
- real time messenger: Pidgin
- medii de dezvoltare software: Netbeans, Eclipse, Code::Blocks, IntelliJ
- procesare de semnal: Octave (alternativă la Matlab)
Pentru anumite programe, este de asemenea posibilă rularea acestora într-un emulator de Windows, numit wine.
Instalare de programe
Instalarea unui program in Linux se face foarte ușor, cu o singură comandă (dacă aplicația este în baza de date a distribuției). Spre exemplu, pentru a instala GNU Octave:
sudo apt-get install -y octave
- execuția unei comenzi de către un utilizator care are drept de administrator, folosind comanda sudo;
- execuția comenzii de către utilizatorul root, care este un cont cu acces nelimitat la toate resursele sistemului; ATENȚIE: Folosiți contul root doar pentru operații de administrare de sistem și deconectați-vă imediat ce ați terminat. Nu dați acces root decât persoanelor în care aveți încredere.
Linux Bash
Noțiunile legate de utilizarea și administrarea sistemului de operare Linux sunt necesare și obligatorii pentru un inginer electronist. În afară de faptul că Linux este un OS open-source stabil și sigur, atractivitatea lui vine în special din posibilitatea de a automatiza procese prin scrierea de scripturi în limbaje de scripting puternice și din faptul că este cel mai răspândit sistem de operare folosit pentru dispozitive embedded. În continuare se vor prezenta noțiuni și comenzi necesare pe parcursul laboratorului de Programarea Calculatoarelor.
Pentru a obține informații legate de utilizarea unei comenzi, în terminalul (consola) Linux se poate da comanda man <comanda>
pentru a deschide manualul la pagina comenzii respective. Odată deschis, se poate naviga cu săgețile sus/ jos și pagina se închide cu tasta 'q'.
Odată deschis terminalul, prompt-ul de comandă arată de cele mai multe ori în felul următor:
student@pracsis01 ~/Desktop $
Acesta este format din următoarele componente:
- student reprezintă numele utilizatorului curent și este urmat de caracterul '@' (at);
- pracsis01 reprezintă numele calculatorului (host name) și care ar trebui să fie unic în rețea; în lipsa acestuia va apărea localhost;
- ~/Desktop reprezintă directorul curent și este urmat de caracterul '$'
Structura de directoare in Linux
Toate fișiere și directoarele în Linux sunt plasate într-o ierarhie de tip arbore, unde directorul din vârf se numește rădăcină (root) și este reprezentat prin caracterul slash (/). Conținului unui director rădăcină arată în felul următor:
În cadrul laboratorului de PC, vom lucra în interiorul directorului personal al utilizatorului student, care este implicit /home/student
(slash este separatorul de cale în Linux, analog cu backslash din Windows).
Instrucțiuni pentru lucrul cu sistemul de fișiere
Navigarea către un director anume se face folosind comanda cd
(Change Directory). Comanda cd
poate fi folosită în următoarele moduri:
- navigarea către o cale absolută, care începe cu slash:
student@pracsis01 ~ $ cd /home/student/Desktop student@pracsis01 ~/Desktop $
- navigarea către o cale relativă, care nu începe cu slash și care depinde de directorul curent:
student@pracsis01 ~ $ cd Desktop student@pracsis01 ~/Desktop $
- navigarea către directorul personal (home directory), prin apelarea comenzii fără alți parametri:
student@pracsis01 ~/Desktop $ cd student@pracsis01 ~ $
- navigarea către calea anterioară (util când e nevoie să alternați între două directoare), folosind parametrul
-
:
student@pracsis01 ~/Desktop $ cd student@pracsis01 ~ $ cd - student@pracsis01 ~/Desktop $ cd - student@pracsis01 ~ $
Această comandă va eșua dacă directorul specificat nu există, sau nu aveți acces la el sau la unul directoarele părinte.
cd ~
este echivalentă cu comanda cd
iar comanda cd ~/Desktop
este echivalentă cu cd /home/student/Desktop
. În plus, directorul personal al altor utilizatori poate fi construit folosind caracterul ~ și numele utilizatorului. De exemplu ~admin
reprezintă calea până la directorul personal al utilizatorului admin.
student@pracsis01 ~/Desktop $ cd ../Desktop/../Desktop/../../student/Desktop student@pracsis01 ~/Desktop $
Aflarea directorului curent (pwd)
Directorul curent se vede în mod normal în prompt, dar în cazul în care acest prompt nu este vizibil sau a fost modificat, sau directorul curent trebuie utilizat în cadrul unui script, comanda care îl afișează pe acesta pe ecran este pwd
(Print Working Directory).
student@pracsis01 ~/Desktop $ pwd /home/student/Desktop
Crearea unui director (mkdir)
Pentru a crea un director inexistent, se folosește comanda mkdir
(MaKe DIRectory) specificând numele directorului care se vrea creat:
student@pracsis01 ~ $ mkdir work
Această comandă poate eșua dacă nu aveți acces la directorul părinte, dacă directorul părinte nu există, sau dacă directorul care se dorește creat există deja. Pentru a crea un director în situația în care directorul părinte nu există, se poate utiliza fanionul -p
:
student@pracsis01 ~/Desktop $ mkdir -p ~/work/pc/F/group1/ion/lab1
Ștergerea unui director gol (rmdir)
Pentru a șterge un director gol, se poate folosi comanda rmdir
(ReMove Directory):
student@pracsis01 ~/Desktop $ mkdir test student@pracsis01 ~/Desktop $ rmdir test student@pracsis01 ~/Desktop $
Dacă directorul nu este gol, atunci se va genera o eroare:
student@pracsis01 ~/Desktop $ mkdir -p test/test2 student@pracsis01 ~/Desktop $ rmdir test rmdir: failed to remove ‘test’: Directory not empty
În acest caz, se poate folosi fanionul -p
pentru a șterge o ierarhie de directoare:
student@pracsis01 ~/Desktop $ rmdir -p test/test2
Sau comanda rm -r
(vezi mai jos).
Ștergerea unui fisier sau recursiv, a unui director (rm)
Pentru a șterge un fișier, un director gol, sau un director care conține alte fișiere sau subdirectoare, se poate folosi comanda rm
(ReMove) cu diferite fanioane:
- pentru a șterge un fișier:
student@pracsis01 ~/Desktop $ rm program.c
- pentru a șterge un director, se folosește fanionul -r:
student@pracsis01 ~/Desktop $ mkdir test student@pracsis01 ~/Desktop $ rm test rm: cannot remove ‘test’: Is a directory student@pracsis01 ~/Desktop $ rm -r test
-r
va șterge tot conținutul directorului, indiferent ce conține acesta, folosiți-l cu mare atenție.Afișarea conținutului directorului curent (ls)
Pentru a vedea conținutul directorului curent se poate utiliza comanda ls
(LiSt):
student@pracsis01 ~/Desktop $ ls chromium-browser.desktop C-Lion.desktop netbeans-8.0.2.desktop Xilinx XPS 14.7.desktop
Pentru a vedea detalii despre fiecare fișier sau director, se poate folosi flag-ul -l
. Comanda ls -l
este atât de utilizată încât în anumite distribuții (Debian/ Ubuntu) are un alias: ll
.
student@pracsis01 ~/Desktop $ ls -l total 44 -rwxr-xr-x 1 student student 12591 Jun 2 16:44 chromium-browser.desktop -rwxr-xr-x 1 student student 136 Aug 20 16:59 C-Lion.desktop -rwxr-xr-x 1 student student 261 Jul 9 16:09 netbeans-8.0.2.desktop -rwxr-xr-x 1 student student 162 Aug 25 13:38 Xilinx XPS 14.7.desktop
Afișarea unui fișier în consolă (cat)
Pentru a vedea conținutul unui fișier text (cum ar fi o sursă C sau un makefile) fără a deschide fișierul pentru editare, se poate utiliza comanda cat
(conCAT):
student@pracsis01 ~/Desktop $ cat /etc/hostname pracsis01
Copiatul unui fișier sau director (cp)
Pentru a copia un fișier sau director, se poate utiliza comanda cp
(CoPy). În cea mai simplă formă, comanda cp
are doi parametri: sursa și apoi destinația, obligatoriu în această ordine. Această comandă se poate folosi în mai multe feluri:
- copiatul unui fișier dintr-un director în altul:
student@pracsis01 ~/Desktop $ cp /etc/hostname ~/Desktop/
- copiatul unui fișier dintr-un director în directorul curent:
student@pracsis01 ~/Desktop $ cp /etc/hostname .
..
reprezintă directorul părinte, .
reprezintă directorul curent.- copiatul unui fișier dintr-un director în altul, schimbându-i numele:
student@pracsis01 ~/Desktop $ cp /etc/hostname ~/Desktop/myhostname
- copiatul unui director, recursiv, în alt director (se folosește fanionul
-r
):
student@pracsis01 ~/Desktop $ cp -r ~/Desktop /tmp/.
- copiatul unui director, recursiv, în alt director (se folosește fanionul
-r
), schimbându-i numele:
student@pracsis01 ~/Desktop $ cp -r ~/Desktop /tmp/MyDesktop
Mutatul unui fișier sau director (mv)
Pentru a muta un fișier sau director, se poate utiliza comanda mv
(MoVe). Analog cu copy, în cea mai simplă formă, comanda mv
are doi parametri: sursa și apoi destinația, obligatoriu în această ordine. Această comandă se poate folosi în mai multe feluri:
- mutatul unui fișier dintr-un director în altul:
student@pracsis01 ~/Desktop $ mv /etc/hostname ~/Desktop/
- mutatul unui fișier dintr-un director în directorul curent:
student@pracsis01 ~/Desktop $ mv /etc/hostname .
- mutatul unui fișier dintr-un director în altul, schimbându-i numele:
student@pracsis01 ~/Desktop $ mv /etc/hostname ~/Desktop/myhostname
- mutatul unui director, recursiv, în alt director (se folosește fanionul
-r
):
student@pracsis01 ~/Desktop $ mv -r ~/Desktop /tmp/.
- mutatul unui director, recursiv, în alt director (se folosește fanionul
-r
), schimbându-i numele:
student@pracsis01 ~/Desktop $ mv -r ~/Desktop /tmp/MyDesktop
Scrierea și compilarea unui program în C
Editarea fișierului sursă
În cadrul laboratorului de PC, vom edita programele C într-un editor simplu de text, pentru a ne obișnui cu procesul de compilare și depanare a programelor. Editoarele de text care pot fi folosite sunt:
- în mod text (din consolă): nano, mcedit, vim
- în mod grafic: kate, gedit, notepad++
Fișierele C sunt fișiere text în care se scrie programul.
Generarea fișierului executabil
Din fișierul sursă, se genereaza fișierul executabil în mai multe etape, conform schemei de mai jos:
Compilatorul de C pe care îl vom folosi se numește GNU C Compiler (sau scurt, gcc). Acesta, de fapt, nu este doar compilator, ci este un toolchain complet pentru generarea de fișiere executabile din fișiere surse C. Acesta poate face doar o parte din, sau toate etapele din schema de mai sus, în funcție de fanioanele utilizate. O parte din fanioanele posibile pentru gcc sunt (pentru lista completă studiaţi pagina de manual pentru GCC - man gcc):
Opțiune | Efect |
---|---|
-o nume_fișier |
Numele fișierului de ieşire va fi nume_fişier. În cazul în care această opțiune nu este setată, se va folosi numele implicit (pentru fișiere executabile: a.out - pentru Linux). |
-I cale_către_fișiere_antet |
Caută fișiere antet și în calea specificată. |
-L cale_către_biblioteci |
Caută fișiere bibliotecă și în calea specificată. |
-l nume_bibliotecă |
Link-editează biblioteca nume_bibliotecă. Atenție!!! nume_bibliotecă nu este întotdeauna același cu numele fișierului antet prin care se include această bibliotecă. Spre exemplu, pentru includerea bibliotecii de funcții matematice, fișierul antet este math.h, iar biblioteca este m. |
-W tip_warning |
Afișează tipurile de avertismente specificate (Pentru mai multe detalii man gcc sau gcc –help). Cel mai folosit tip este all. Este indicat ca la compilarea cu -Wall să nu apară nici un fel de avertismente. |
-c |
Compilează și asamblează, dar nu link-editează. Generează fișiere obiect, cu extensia .o. |
-S |
Se oprește după faza de compilare, fară să asambleze. Rezultă cod assembler în fișiere cu extensia .s. |
În continuare vom prezenta cateva exemple:
- generarea directă a unui executabil numit hello, dintr-un singur fișier sursă, hello.c, utilizând biblioteca standard:
student@pracsis01 ~/Desktop $ gcc hello.c -o hello
- generarea directă a unui executabil numit hello, dintr-un singur fișier sursă, hello.c, utilizând biblioteca standard și biblioteca math:
student@pracsis01 ~/Desktop $ gcc hello.c -o hello -lm
- generarea directă a unui executabil numit hello, din două fișiere sursă, hello1.c și hello2.c, utilizând biblioteca standard:
student@pracsis01 ~/Desktop $ gcc hello1.c hello2.c -o hello
- generarea unui fișier obiect, numit hello.o, dintr-un fișier sursă numit hello.c:
student@pracsis01 ~/Desktop $ gcc -c hello.c -o hello.o
- generarea unui fișier obiect, numit hello.o, din două fișiere sursă, hello1.c și hello2.c:
student@pracsis01 ~/Desktop $ gcc -c hello1.c hello2.c -o hello.o
- generarea unui executabil numit hello, din două fișiere obiect, hello1.o și hello2.o, utilizând biblioteca standard și biblioteca math:
student@pracsis01 ~/Desktop $ gcc hello1.o hello2.o -o hello -lm
- generarea unui fișier cu cod de asamblare, numit hello.s, dintr-un fișier sursă numit hello.c:
student@pracsis01 ~/Desktop $ gcc -S hello.c -o hello.s
- generarea unui fișier cu cod de asamblare, numit hello.s, dintr-un fișier sursă numit hello.c:
student@pracsis01 ~/Desktop $ gcc -S hello.c -o hello.s
- generarea unui fișier sursă preprocesat, numit hello_pre.c, dintr-un fișier sursă numit hello.c:
student@pracsis01 ~/Desktop $ gcc -E hello.c -o hello_pre.c
Exerciții
Porniți un editor de text (gedit / kate), copiați cerințele de mai jos într-un fișier nou, și scrieți în dreptul fiecăreia din ele comanda sau comenzile care realizează cerința, după ce au fost testate în consolă.
Bash
- Navigați până în directorul personal al user-ului student.
- Creați un director numit work.
- În directorul work creați următoarele structuri de directoare:
- PC/seriaF/grupaN/nume/lab1
- PC/seriaF/grupaN/nume/lab2
- Schimbați directorul curent în /home/student/work/PC/seriaF/grupaN/nume/lab1.
- Dați comanda echo Acesta este primul meu fisier text > test.txt
- Vizualizați lista de fișiere din directorul curent.
- Vizualizați conținutul fișierului din directorul curent.
- Faceți o copie a fișierului text.txt numită test2.txt.
- Mutați fișierul test2.txt în directorul /home/student/work/PC/seriaF/grupaN/nume/lab2
- Schimbați directorul curent în /home/student/work/PC/seriaF/grupaN/nume/lab2.
- Vizualizați lista de fișiere din directorul curent.
- Vizualizați conținutul fișierului din directorul curent.
- Ștergeți directorul /home/student/work
GCC
- Deschideți un editor de text.
- Scrieți într-un fișier nou următorul cod C:
#include <stdio.h>
int main(){
printf("Hello PC Lab!\n");
}