[[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/)