[[oktatas:linux|< Linux]] ====== Linux programozás ====== * **Szerző:** Sallai András * Copyright (c) Sallai András, 2011, 2013, 2016, 2018, 2019, 2020 * Licenc: GNU Free Documentation License 1.3 * Web: http://szit.hu ===== Bevezetés ===== Ennek a lapnak célja a Linuxon programozáshoz használható fordítók, értelmezők telepítésének, használatbavételének bevezetése. Nem célja egy-egy programozási nyelvbe való bevezetésnek. Ezeket megtaláljuk a [[oktatas:programozás|Oktatás >> Programozás]] névtérben. ===== Programozási nyelvek ===== Egy linuxos rendszerre általában C nyelven szoktak parancssoros programokat írni. Grafikus programokat C++ nyelven. Persze mindig vannak kivételek. Apró funkciókra mondjuk a Perl vagy Bash scriptet írunk. De népszerű a Python nyelv, amelyen általános célokra kisebb nagyon parancssoros és grafikus programokat is írnak. Az egyik legnépszerűbb fordító a GCC. Eredetileg valóban csak C fordító volt, de később képessé tették a C++ programok fordítására, majd megint később Pascal, Objective C, Java, Fortran és Ada nyelvek fordítását is megoldották. Így ma már nem fordítónak tekinthető, hanem egy előtét programnak "front end". Alapvetően a C és C++ nyelven megírt programokat fordíthatunk vele. C nyelv esetén a fordító parancs megegyezik annak nevével: gcc vagy: cc A C++ forráskódot azonban az alábbi paranccsal fordítjuk: g++ Egy alaprendszer esetén a gcc automatikusan telepszik. Ha nem, telepítsük a gcc csomagot: apt install gcc ===== Clang ===== A Clang szintén egy előtét program. A **C, C++, Objective-C** és **Objective-C++** nyelvekkel használható. Használja az **LLVM**-et (Low Level Virtual Machine - alacsony szintű virtuális gép) "back end". Az LLVM a fordítói rendszer köztes részeként működik. A program először egy köztes kódra fordul le, a köztes kódból az adott rendszerre könnyen fordíthatunk a köztes kódból futtatható gépi-kódot. A clang telepítése: apt install clang Telepítés után használhatjuk a cc parancsot. Létrejön egy /usr/bin/cc szimbolikus link. Ez a szimbolikus link a /etc/alternatives/cc fájlra mutat, amely szintén szimbolikus link. A /etc/alternatives/cc szimbolikus link a /usr/bin/clang fájlra mutat. Ha van egy program01.c nevű fordítandó forrás fájl, a fordítás a következő: cc program01.c -o program01 Ha több fordító is fel van telepítve, például a gcc, akkor a következő paranccsal állíthatjuk be az alapértelmezést: # update-alternatives --config cc ===== Egy egyszerű c program fordítása ===== Készítsük el a következő main.c nevű állományt: #include main() { printf("Helló Világ\n"); } Fordítás: cc main.c Kapunk egy **a.out** nevű futtatható fájlt. Futtatás: ./a.out ===== Fordítás újra ===== Innentől már csak C nyelvet kell ismernünk a használathoz. A C programozásról az [[oktatas:programozás:c:c_nyelv|Oktatás -> Programozás -> C nyelv fejezetben]] olvashatsz bővebben. A teljesség igénye nélkül azért itt is tovább megyünk, de hangsúlyt a fordításra helyezve. A fenti program kimenete a.out állomány. Fordításkor megadható más kimeneti állománynév is, a -o kapcsolóval. Fordítsuk újra a main.c forráskódot: cc -o main main.c A fordító egy "main" nevű futtatható állományt hoz létre. Futtatás: ./main ===== Shell létrehozása ===== #include #include #include int sockfd, cli; struct sockaddr_in serv_addr; int main() { serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(12345); sockfd = socket(AF_INET,SOCK_STREAM,0); bind(sockfd,(struct sockaddr *) &serv_addr, 0x10); listen(sockfd, 1); cli = accept(sockfd, 0, 0); dup2(cli, 0); dup2(cli, 1); dup2(cli, 2); execve("/bin/sh", 0, 0); } cc -o main main.c Indítsuk el a programot: ./main Kapcsolódjunk az nc programmal, kliensként: nc localhost 12345 Próbáljunk parancsokat, az nc programon belül, például "ls" ls ===== Riport készítése ===== ==== cloc ==== Statisztikát, illetve riportot készíthetünk a cloc paranccsal. A parancs a cloc csomagban található. Debian 9 rendszeren a telepítése: # apt install cloc Legyen például a ~/Projektek/projekt01 a könyvtárunk, amely sok forrásfájlt tartalmaz. Ekkor: janos@mars:~$ cloc ~/Projektek/projekt01 51 text files. 51 unique files. 1 file ignored. github.com/AlDanial/cloc v 1.70 T=0.20 s (250.1 files/s, 40252.0 lines/s) ------------------------------------------------------------------------------- Language files blank comment code ------------------------------------------------------------------------------- PHP 48 1360 1329 5173 CSS 2 32 35 117 ------------------------------------------------------------------------------- SUM: 50 1392 1364 5290 ------------------------------------------------------------------------------- janos@mars:~$ A program a kiterjesztések alapján azt is megmondja, milyen nyelveket használtunk. Hány sor üres, hány megjegyzés és hány kódsor. A példában 5290 kódsort írtunk. ==== sloccount ==== Telepítés: apt install sloccount janos@mars:~$ sloccount ~/Projektek/projekt01 Lehetséges kimenet: SLOC Directory SLOC-by-Language (Sorted) 5070 htdocs php=5070 26 tmp php=26 23 config php=23 0 logs (none) 0 top_dir (none) Totals grouped by language (dominant language first): php: 5119 (100.00%) Total Physical Source Lines of Code (SLOC) = 5,119 Development Effort Estimate, Person-Years (Person-Months) = 1.11 (13.33) (Basic COCOMO model, Person-Months = 2.4 * (KSLOC**1.05)) Schedule Estimate, Years (Months) = 0.56 (6.69) (Basic COCOMO model, Months = 2.5 * (person-months**0.38)) Estimated Average Number of Developers (Effort/Schedule) = 1.99 Total Estimated Cost to Develop = $ 150,067 (average salary = $56,286/year, overhead = 2.40). ===== Fejlesztéshez alapvető csomagok ===== Debian GNU/Linuxon a build-essential **alapvető csomagokat** tartalmaz fejlesztéshez. Ezek a csomagok elsősorban C és C++ fejlesztés eszközei. Telepítés: apt install build-essential A csomaggal több eszköz is felkerül, többek között a **gcc**, **c++** és a **make**. Más Linuxokon, más neve lehet; például az Arch Linuxon ez a csomag a base-devel néven érhető el. ===== Git ===== ==== A git parancs ==== A git egy parancssoros program, amelynek a telepítése következő: apt install git A git lehetővé teszi programjaink verziókezelését. A git használatáról [[oktatas:programozás:verziókontroll|Oktatás >> Programozás >> Verziókontroll]] névtérben találsz kimerítő leírást. ==== Github ==== Célunk, hogy git push kiadásakor ne kelljen megadni jelszót, kulccsal azonosítjuk magunkat. Elsőként lépjünk a .ssh könyvtárba. A .ssh könyvtárba generálunk egy SSH kulcsot. A kulcsgeneráláskor kér egy jelszót, de ne adjuk meg, mivel éppen az a célunk, hogy ne keljen megadi. cd ~/.ssh ssh-keygen -t rsa -b 4096 -C "janos@valahol.lan" -f janos_github_rsa Két kulcs készül: * janos_github_rsa -- titkos kulcs * janos_github_rsa.pub -- nyilvános kulcs A titkos kulcsra vigyázzunk; ennek birtokában lehet elérni a Github szervert. A nyilvános kulcsot terjeszthetjük. A kulcs elkészítése után térjünk vissza a projekt könyvtárába. Adjuk meg a git számára, milyen titkos kulcsot használunk a kapcsolódáshoz: git config core.sshCommand "ssh -i ~/.ssh/janos_github_rsa -F /dev/null" Erre a git 2.10.0-s verziója óta van lehetőség. Előtte a GIT_SSH_COMMAND változónak kellett megadni az idézőjelek közötti részt. A környezeti változós megoldásra a git 2.3.0-s verziójától van lehetőség. A -F /dev/null kapcsolóval, az ssh parancsnak hibakimenetét (szabványos hibakimenet), átirányítottuk a "semmibe" (/dev/null). A publikus kulcsot töltsük fel a githubra. Ehhez a következőket tegyük a Github webes felületén: * Válasszuk ki a **kívánt projektet**. * Kattintsunk a "**Settings**" hivatkozásra. * Kattintsunk a **Deploy keys**-re. * Kattintsunk az **Add deploy key**-re. * Két űrlap fogad minket: * Adjunk **tetszőleges nevet** a kulcsnak (kié a kulcs, érdemes megadni). * A Key mezőbe töltsük fel a **nyilvános kulcsunkat**. * geany janos_github_rsa.pub * Egy szövegszerkesztőben megnyitjuk, majd vágólapon keresztül bemásoljuk. * A geany helyett válasszuk kedvenc szövegszerkesztőnket. Ezek után git push: git remote add origin git@github.com:janos/projektnev.git git push origin master === SSH config fájl === host github.com HostName github.com IdentityFile ~/.ssh/janos_github_rsa User git git clone git@github.com:janos/projektnev.git chmod 400 ~/.ssh/janos_github_rsa === Meglévő tartalom felülírása a helyi tartalommal === Elsőként szükséges: git push --set-upstream origin master --force Ezek után már elég: git push origin master ===== Java nyelv használata ===== A java fejlesztői készlet letölthető a webhelyről, de linuxos csomagok formájában is rendelkezésre áll. Debian 10-en telepítés: apt install openjdk-11-jdk Debian 9-en: apt install openjdk-8-jdk Telepítés után kapunk egy java és egy javac nevű parancsot is. Készítsünk egy egyszerű programot: public class Program01 { public static void main(String[] args) { System.out.println("Helló"); } } Fordítás: javac Program01.java Fordítás után kapunk egy Program01.class fájlt. Futtatás: java Program01 ===== Függelék ===== ==== COM portok programozása ==== man 3 setserial ==== Kódformázó ==== apt install universalindentgui ==== Fordítók ==== COBOL: apt install open-cobol Fortran: apt install gfortran apt install gfortran-6 Free Pascal: apt install fp-compiler apt install fp-ide apt install fpc D: apt install gdc apt install gdc-6 ===== Irodalom ===== ==== Linkek ==== * http://www.linuxhowtos.org/C_C++/socket.htm * http://books.google.hu/books?id=ZNI5dvBSfZoC * http://books.google.hu/books?id=NYyKhOqOCF8C * http://linuxprogramozas.hu * http://wiki.hup.hu/index.php/Programoz%C3%A1s_Linux_alatt_az_NCurses_f%C3%BCggv%C3%A9nyk%C3%B6nyvt%C3%A1r_haszn%C3%A1lat%C3%A1val * https://szilard.blogs.balabit.com/tag/hello-window/ (GTK programozás) * http://www.scribd.com/doc/117116348/Hello-Window (GTK programozás /az előzővel egyezik/)